用nulliff替换NULL返回不同的查询结果

时间:2019-07-18 22:53:30

标签: sql sql-server

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

有什么想法吗?

<!-- .* -->

3 个答案:

答案 0 :(得分:3)

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

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

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

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

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

此值返回正确的值“测试”

因此,要解决您的查询,您只需将ISNULL替换为COALESCE即可:

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

答案 1 :(得分:1)

您可以两次使用isnull()函数:

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

如果@yourparamnull,那么isnull(null,@yourparam)也会返回null

答案 2 :(得分:1)

让参数由运行时在查询中提供的@param表示。

您的查询可能就是

declare @param varchar(50)
select * from table
where nullif(@param, '') is null or table.code = @param

例如,请参见以下两个代码片段,只有当您提供的名称存在一个表时,第一个查询才返回结果,第二个查询将返回所有记录

declare @param varchar(50) = 'table_from_your_db'
select * 
from information_schema.tables t
where nullif(@param, '') is null or t.table_name = @param
declare @param varchar(50) = '' 
select * 
from information_schema.tables t
where nullif(@param, '') is null or t.table_name = @param