SQL Server where子句在商店过程中使用iif

时间:2018-03-19 06:30:28

标签: sql sql-server stored-procedures where-clause iif

我在SQL Server中有一个存储过程。我的应用程序中有一个过滤页面,我想选择所有CDT_ID,如果我没有输入名称,则输入lower_age和upper_age,它将显示所有CDT_ID。但是,如果我输入了姓名和年龄,它会显示CDT_ID所有CDT_NAMECDT_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的情况下运行查询。你知道如何解决我的问题吗?条款?

2 个答案:

答案 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。