在SQL中使用ISNULL的可疑查询

时间:2011-02-17 01:14:58

标签: sql-server tsql isnull

我希望在查询中防止不可搜索的表达式,这是检查空条件的更好方法吗?

AND c.Account IS NOT NULL 
AND c.Account <> ''

AND ISNULL(c.Account,'') <> ''

我突然意识到Account来自LEFT JOIN所以它可能为空。我想要它们只相交的情况,这意味着我应该只使用INNER JOIN呵呵?感谢facepalms;)

然而,忽略那种令人作呕的自我实现,我仍然想在一般情况下知道答案,我不能使Account成为NOT NULL列。

2 个答案:

答案 0 :(得分:2)

C.Account <> ''相当于ISNULL( c.Account, '' ) <> ''

SQL Server可能足够聪明,可以将IsNull转换为等效的SARG表达式,但是如果你一直在使用函数,那么Coalesce是一个更好的选择,因为它是SQL标准的一部分,允许多个值(而不仅仅是两个与IsNull)并避免使用很可能是微软在IsNull中设计的最令人困惑的函数名称。

答案 1 :(得分:2)

只需使用WHERE c.Account <> ''

即可

对于null或空字符串,这不会评估为true,并且可以使用Account上的范围搜索来评估。

使用ISNULLCOALESCE会使表达式无法分析,无论如何都不需要。

如果你想区分真正的空字符串和完全由空格组成的字符串,你可以使用

 WHERE c.Account IS NOT NULL AND DATALENGTH(c.Account) > 0

它结合了一个sargable谓词,该谓词允许索引寻找跳过索引中的空值与不可分析的值相对于剩余值。