在where子句中切换case(sql server)

时间:2012-03-31 11:15:50

标签: sql-server

我想在sql语句where子句中使用case但是我有一个问题,因为我想在某个值的基础上创建一个where子句条件,我想在它的基础上设置一个not in子句值

这是我遇到问题的查询

WHERE CODE = 'x'  and 
   ID not in (
      case  
        when 'app'='A' then  '570','592'
        when  'Q' then ID 592,90
        else 592,90
      END

但它不是语法

3 个答案:

答案 0 :(得分:1)

您可以将其嵌入到SQL where where子句中:

WHERE CODE='x' and (('app' = 'A' AND ID not in ('570', '592')) OR
('app' = 'Q' AND ID not in ('592','90')) OR ('app' != 'A' AND 'app' != 'Q' AND ID not in ('592','90'))

或类似的东西。令人毛骨悚然的代码,所以我建议对不同类型的'app'参数使用不同的查询,或者创建一个存储过程来满足您的需求。

答案 1 :(得分:1)

由于592始终是集合的一部分,并且“Q”情况与默认情况相同,所以只需这样:

where CODE = 'x' and ID not in (592, case app when 'A' then 570 else 90 end)

答案 2 :(得分:1)

考虑到您可能正在尝试将实际应该是单独的语句组合在一起。

您可能需要考虑使用测试条件(可能通过简单的IF语句)来确定实际执行哪个特定的T-SQL语句。

伪代码:

IF (/*Conditions are True*/)
BEGIN
    --SQL Statement
END
ELSE IF (/*Some other conditions are True)
BEGIN
    --SQL Statement
END
ELSE
BEGIN
    --Failsafe SQL statement
END

生成的代码的逻辑意图将更容易理解和维护。