通过搜索多个SO线程,我无法编写一个在where子句中返回适当条件的查询。
例如,我的列Col1为int
,变量var1
为varchar
,我现在使用下面的查询,但它不起作用。
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 ....)
答案 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')