我在SQL Server中有一个存储过程。我的应用程序中有一个过滤页面,我想选择所有CDT_ID
,如果我没有输入名称,则输入lower_age和upper_age,它将显示所有CDT_ID
。但是,如果我输入了姓名和年龄,它会显示CDT_ID
所有CDT_NAME
和CDT_AGE
范围就像我在过滤列中输入的那样。我的查询如下所示:
select CDT_ID from CANDIDATE
where CDT_NAME LIKE iif(@name is null, '', @name)
AND CDT_NAME between (iif(@lower_age is null, '', @lower_age) and iif(@upper_age is null, '', @upper_age))
问题是我的查询结果在执行我的商店程序时什么都没显示。如果我在没有显示大量CDT_ID
的情况下运行查询。你知道如何解决我的问题吗?条款?
答案 0 :(得分:0)
超过IIF, COALESCE 在这里会更好用。 此外,在WHERE子句中使用参数时,WHERE子句的典型语法类似于
...
WHERE 1=1 AND p=@param
有关详细信息,请参阅 this answer
在您的查询中未提及CDT_AGE。我冒昧地纠正了它。
这是修改过的查询
select
CDT_ID
from CANDIDATE
where
1=1
AND
CDT_NAME LIKE COALESCE(@name,CDT_NAME)
AND
CDT_AGE between COALESCE(@lower_age,0) AND COALESCE(@upper_age,1000)
答案 1 :(得分:0)
您使用的是CDT_NAME而不是CDT_AGE。
我不了解您的确切业务规则,但我会使用简单的ORed条件(可能启用索引访问,而不是专有的IIF
或符合标准的SQL COALESCE
。太):
select CDT_ID
from CANDIDATE
where (@name is null and @lower_age is null and @upper_age is null)
or ( CDT_NAME LIKE @name
AND CDT_AGE between @lower_age AND @upper_age
)
如果要返回所有行,如果name或age为null,则可以将其修改为:
where (@name is null or @lower_age is null or @upper_age is null)
或者在选择之前添加一些健全性检查并应用默认值。 或者基于NULL运行两个不同的Selects。