从where子句中的case语句返回条件

时间:2013-01-31 12:38:09

标签: sql sql-server sql-server-2005

通过搜索多个SO线程,我无法编写一个在where子句中返回适当条件的查询。 例如,我的列Col1为int,变量var1varchar,我现在使用下面的查询,但它不起作用。

Where CASE WHEN var1 = '1' THEN (Col1 = 1)  
WHEN var1 = '2' THEN (Col1 = 2)  
ELSE AND (1= 1) 
END

它给了我syntax error near '='

编辑:

如果我想要像

那样的条件

Col1 IN(condtions ....)

3 个答案:

答案 0 :(得分:5)

我认为应该是这样;

Where Col1 = CASE WHEN var1 IN ('1','2') THEN var1 ELSE Col1 END

OR

Where Col1 = CASE  var1 WHEN  '1' THEN 1
                        WHEN  '2' THEN 2
             ELSE Col1 END ...

作为旁注,如果 Col1 is nullable need to select那些也可以使用;

Where Col1 is null OR 
             Col1 = CASE  var1 WHEN  '1' THEN 1
                        WHEN  '2' THEN 2
             ELSE Col1 END ...

答案 1 :(得分:2)

CASE是一个返回值的表达式。它不像IF那样控制流逻辑(尽管类似的关键字在VB等某些语言中也是如此)。尝试:

WHERE Col1 = CASE 
  WHEN var1 = '1' THEN 1
  WHEN var1 = '2' THEN 2 
  ELSE Col1
END

除非 Col1为NULL,否则这将按照您尝试过的代码进行操作。一种解决方法是无法在数据中显示的神奇值:

WHERE COALESCE(Col1, -1) = CASE
  ...
ELSE COALESCE(Col1, -1) END

答案 2 :(得分:0)

您需要将列放在案例之外:

where Col1 = case when var1 = '1' then 1
                  when var1 = '2' then 2
             end
      OR (var1 != '1' AND var1 != '2')