在 TSQL 中使用 ISNULL 的可控制查询
-
14-11-2019 - |
题
我希望防止查询中出现不可控制的表达式,这是检查空条件的更好方法吗?
AND c.Account IS NOT NULL
AND c.Account <> ''
或者
AND ISNULL(c.Account,'') <> ''
我突然意识到指出 Account
来自一个 LEFT JOIN
所以它可能为空。我想要它们只相交的情况,这意味着我真的应该只使用 INNER JOIN
嗯?谢谢你的捂脸;)
然而,忽略了令人作呕的自我实现,我仍然想知道在一般情况下我无法做出的答案 Account
NOT NULL 列。
解决方案
C.Account <> ''
相当于 ISNULL( c.Account, '' ) <> ''
SQL Server 可能足够聪明,可以将 IsNull 转换为等效的 SARG 表达式,但如果您一心想要使用函数,那么 Coalesce 是更好的选择,因为它是 SQL 标准的一部分,允许多个值(而不是 IsNull 时只允许两个值) )并避免使用 Microsoft 在 IsNull 中设计的可能最令人困惑的函数名称。
其他提示
只需使用 WHERE c.Account <> ''
这对于任何一个都不评估为 true null
或空字符串,并且可以使用范围搜索来评估 Account
.
使用任一 ISNULL
或者 COALESCE
将使表达式不可控制并且无论如何都不需要。
如果你想区分真正的空字符串和完全由空格组成的字符串,你可以使用
WHERE c.Account IS NOT NULL AND DATALENGTH(c.Account) > 0
它结合了一个可控制谓词,允许索引跳过索引中的空值和一个针对剩余值的不可控制谓词。
COALESCE
IS SARGABLE 因为它只是一个快捷表达式(相当于使用 CASE WHEN IS NOT NULL THEN ELSE
...).
ISNULL
是一个内置函数,所以 ISNULL
不可控制
不隶属于 StackOverflow