我希望防止查询中出现不可控制的表达式,这是检查空条件的更好方法吗?

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 不可控制

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top