首页 > 解决方案 > 用 nulliff 替换 NULL 返回不同的查询结果

问题描述

我正在尝试构建一个动态查询,我将传递一个参数,如果参数为空,则查询返回我在表中拥有的所有项目。第二个查询返回我在表中的所有项目。第一个查询返回的结果要短得多。

有任何想法吗?

select ...
where table.code = isnull(nullif('',''),table.code)

select ...
where table.code = isnull(null,table.code)

标签: sqlsql-server

解决方案


这个简单的测试显示了问题:

SELECT ISNULL(NULLIF('', ''), 'TEST')

它没有像预期的那样返回 TEST,而是返回'T',因为第一个 NULLIF 返回 varchar(1) 类型的 null(其参数的类型),因此 ISNULL 的返回值也被强制转换为 varchar(1)。

我会简单地使用 COALESCE 而不是 ISNULL (它不会尝试将返回值转换为第一个值的类型):

SELECT COALESCE(NULLIF('', ''), 'TEST')

这个返回正确的值'TEST'

因此,要修复您的查询,您只需将 ISNULL 替换为 COALESCE :

select ...
where table.code = coalesce(nullif('',''),table.code)

推荐阅读