加倍WHERE条件

时间:2012-04-17 06:55:43

标签: sql sql-server sql-server-2008

是否有可能在where语句@Age param中执行类似的操作?

 @AGE Varchar(8)

 SELECT NAME FROM TABLE WHERE 
 (
 If @AGE='man'
  then (AGE = 'man' or AGE = 'boy')
  else (AGE = 'man')
 )
 AND City IS NULL

4 个答案:

答案 0 :(得分:2)

是的,就像这样:

SELECT NAME FROM TABLE WHERE 
((@AGE='man'
   AND (AGE = 'man' or AGE = 'boy'))
OR
(@AGE <> 'man'
  AND (AGE = 'man')))
AND City IS NULL

注意条件@AGE <> 'man'可能需要调整,具体取决于@AGE变量是否为空。

我回答了一个非常相似的问题here

  

这是WHERE子句中非常常见的技术。如果你想   在WHERE子句中应用一些“IF”逻辑,您需要做的就是添加   带有布尔AND的额外条件到它需要的部分   适用。

答案 1 :(得分:1)

执行此操作的一种方法是使用EXEC并按If's构建String命令。

类似的东西:

declare @t nvarchar(max)
@AGE Varchar(8)
set @t=' SELECT NAME FROM TABLE WHERE '


 If @AGE='man' set @t=@t+'(AGE = ''man'' or AGE = ''boy'')'
  else  set @t=@t+'(AGE = 'man')'

set @t=@t+' AND City IS NULL'

答案 2 :(得分:1)

以连接正常形式(“一系列AND”,较少依赖于parans):

SELECT * 
  FROM TABLE
 WHERE ( @AGE <> 'man' OR (AGE IN ('man', 'boy') ) )
       AND ( @AGE = 'man' OR AGE = 'man' )
       AND CITY IS NULL;

这里的想法是使用暗示重写规则:

( IF x THEN y )  is equivalent to  ( NOT ( x ) OR y )

这是一些测试代码:

WITH T 
     AS
     (
      SELECT * 
        FROM (
              VALUES (1, 'man', NULL), 
                     (2, 'boy', NULL), 
                     (3, 'girl', NULL)
             ) AS T (NAME, AGE, CITY)
     ),
     Params
     AS
     (
      SELECT * 
        FROM (
              VALUES ('man'), 
                     ('boy'), 
                     ('girl')
             ) AS T (p_AGE)
     ), 
     Results
     AS
     (
      SELECT Params.*, T.*, 
             CASE WHEN     ( ( p_AGE <> 'man' OR (AGE IN ('man', 'boy') ) ) AND ( p_AGE = 'man' OR AGE = 'man' ) )  THEN 'TRUE'
                  WHEN NOT ( ( p_AGE <> 'man' OR (AGE IN ('man', 'boy') ) ) AND ( p_AGE = 'man' OR AGE = 'man' ) )  THEN 'FALSE'
                  ELSE 'UNKNOWN' 
             END AS result_onedaywhen, 
             CASE WHEN     ( AGE='man' OR (p_AGE='MAN' and AGE='boy') )  THEN 'TRUE'
                  WHEN NOT ( AGE='man' OR (p_AGE='MAN' and AGE='boy') )  THEN 'FALSE'
                  ELSE 'UNKNOWN' 
             END AS result_Damien_The_Unbeliever
        FROM T, Params
     )
SELECT * 
  FROM Results;

答案 3 :(得分:0)

或者您可以使用decode functions