在 ms sql 服务器的 where 子句中替换 FROM ISNULL

Substitute FROM ISNULL in where clause in ms sql server

我们在 Queries 上使用了 Stored Procedure。我们的一些字段得到了 NULL 值,所以为了得到这个值,我们将 ISNULL 的转换放在 WHERE 条件中,但每次检查它都会影响我们的 strodproc 基于SQL performance tool.

例如

SELECT * FROM tblInfo
WHERE ISNULL(fldInfo,'') <> ''

tblInfo

fldinfo
NULL
30
NULL
20

查询

SELECT * FROM tblinfo WHERE fldinfo NOT IN (30,20) - different result
SELECT * FROM tblinfo WHERE ISNULL(fldinfo,'') NOT IN (30,20) - Correct

结果

我们可以使用的任何其他脚本替换过程,以便我们可以获得值但不影响查询的性能。

COALESCE 是您可以尝试的一种选择。它的行为方式相同。但是,性能之间的差异必须由您通过一些测试来评估

此处概述了 ISNULL 和 COALESCE 之间的一些区别: SQL - Difference between COALESCE and ISNULL?

编辑:根据多人进行的测试和理论,ISNULL 似乎比 COALESCE 更好

Which is quicker COALESCE OR ISNULL?

无需 IIF。只需检查 NULL

WHERE fldinfo IS NOT NULL

或者,当然,如果您想要满足此条件的行,请使用 IS NULL

您的方法将是不可搜索的。即使你有一个索引,它也不会被使用。

正确的方法是使用 IS NOT NULL 条件

SELECT * FROM tblInfo 
WHERE fldInfo <> '' 
  AND fldInfo IS NOT NULL

如果您没有索引,则在 fldinfo 上创建一个 index 以提高性能

更新:

Not In 无法比较 NULL 值。与 NULL 值的比较未知,因此无法 return 与 NULL 值。这是执行此操作的正确方法

SELECT *
FROM   tblInfo
WHERE  (fldinfo NOT IN ( 30, 20 ) OR fldinfo IS NULL)