7

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

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

或者

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

我突然意识到这Account是来自 aLEFT JOIN所以它可能是空的。我想要它们只相交的情况,这意味着我真的应该只使用一个INNER JOIN吧?谢谢你的掌心;)

但是,忽略这种令人作呕的自我实现,我仍然想知道在我无法创建AccountNOT NULL 列的一般情况下的答案。

4

3 回答 3

4

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

对于任何一个字符串或空字符串,这都不会评估为 true,null并且可能会使用 range seek on 进行评估Account

使用其中一个ISNULLorCOALESCE会使表达式变得不可分割,并且无论如何都不需要。

如果您想将真正的空字符串与完全由空格组成的字符串区分开来,您可以使用

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

它结合了一个 sargable 谓词,该谓词允许索引寻求跳过索引中的 null 和一个针对剩余值的 unsargable 谓词。

于 2015-09-11T22:03:15.260 回答
2

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

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

于 2011-02-17T01:25:53.583 回答
-3

COALESCEIS SARGABLE 因为它只是一个快捷表达式(相当于使用CASE WHEN IS NOT NULL THEN ELSE...)。

ISNULL是一个内置函数,所以ISNULL不是 SARGABLE

于 2015-09-10T08:49:19.117 回答