我正在学习SQL,所以要温柔。如果我在我的 where 子句中指定了一个特定角色,它只会拉动填充该角色的情况。如何还包含 NULL 值或那些空白角色?
这是现在的 where 子句:
WHERE (dbo.vcases.lawtype = 'My Cases') AND
(dbo.vcase_parties_people.role_sk = 4001) AND
**(v1.role_sk = 3940) AND
(v1.report_ind = 'Y') AND
(v2.role_sk = 3939) AND
(v2.report_ind = 'Y')** AND
(dbo.vcases.case_type NOT IN ('Case type 1', 'Case type 2'))
SQL 中的COALESCE()
表达式对于在给定列或表达式遇到 NULL 时替换默认值很有用。当查询优化器遇到COALESCE()
调用时,它会在内部将该表达式重写为等效的CASE...WHEN
表达式。在您的示例查询中,WHERE (COALESCE(v1.role_sk, 3940) = 3940)
的操作(和优化(与WHERE (CASE WHEN v1.role_sk IS NOT NULL THEN v1.role_sk ELSE 3940 END = 3940)
相同。
由于您的示例特别涉及 WHERE
子句中的条件,因此您可能希望使用 OR
操作,该操作可以比 COALESCE()
表达式更好地优化:WHERE (v1.role_sk = 3940 OR v1.role_sk IS NULL)
。
这也假设查询中的任何联接都不会筛选出role_sk列为 NULL 的行。
您可以按如下方式编辑代码:
WHERE (dbo.vcases.lawtype = 'My Cases') AND
(dbo.vcase_parties_people.role_sk = 4001) AND
(v1.role_sk = 3940 OR v1.role_sk IS NULL) AND
(v1.report_ind = 'Y') AND
(v2.role_sk = 3939) AND
(v2.report_ind = 'Y') AND
(dbo.vcases.case_type NOT IN ('Case type 1', 'Case type 2'))
有人建议使用 Coalesce 函数,但在 SQL 中一个好的经验法则是避免在 WHERE 子句中使用函数,因为它会降低表索引的效率。 WHERE 子句中的函数通常会导致索引扫描,而不是更高效的索引查找。