我正在尝试建立一个动态查询,我将传递一个参数,如果该参数为空,则查询将返回表中所有的项。第二个查询返回表中所有的项目。第一个查询返回的结果要短得多。
有什么想法吗?
<!-- .* -->
答案 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)
如果@yourparam
是null
,那么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