在 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)
我们在 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)