【问题标题】:SQL Sever: in...case...in WHERE clauseSQL Server:in...case...in WHERE 子句
【发布时间】:2011-03-28 09:00:50
【问题描述】:

我需要编写一个类似这样的查询:

Select [something]
Where
condition in
case
when (if another_condition = A and 3rd Condition = B) then (C,D)
when (if another_condition = N and 3rd Condition = E) then (F,G)
else (J,K)
end

本质上,我想要的是如果满足 A 和 B,条件可以设置为 C 或 D,如果满足 N 或 E,则条件可以设置为 F 或 G,否则条件设置为 J 或 K . 但是,当我运行它时,我一直在 关键字“Case”附近的语法不正确。

请帮忙!谢谢!

【问题讨论】:

  • CASE 语句中的“设置为 C 或 D”是什么意思?您不能从满足相同的 CASE 条件得到 2 个不同的结果。
  • 要绕过 CASE 错误,请将 CASE 语句放在括号中。

标签: tsql select case where


【解决方案1】:

我可能会采用 G Mastro 将查询扩展为布尔表达式的方法。虽然嵌套查询方法可行,但代码的意图不太明显 IMO。

话虽如此,如果您的 CASE 语句中有很多案例,您可能需要考虑重新塑造您的数据,因为无论您如何编写查询,它都归结为一个大布尔表达式。

【讨论】:

    【解决方案2】:

    也许是这样的:

    Where  (Another_Condition = 'A' And Third_Condition = 'B' And Condition in ('C','D'))
           Or 
           (Another_Condition = 'N' and Third_Condition = 'E' And Condition in ('F','G'))
           Or 
           Condition In ('J','K')
    

    在 where 子句中混用 and 和 or 时要非常小心。括号很重要。

    【讨论】:

    • 我也打算提出这个建议。我认为您的最终 OR 子句是错误的,因为它会为每一行测试 Condition IN ('J', 'K') ,这与 CASE ... ELSE 不同,它只会测试与第一行不匹配的行两个子句。最后一行应为: NOT ((Another_Condition = 'A' AND Third_Condition = 'B') OR (Another_Condition = 'N' AND Third_Condition = 'E')) AND Condition IN ('J', 'K')跨度>
    【解决方案3】:

    这个怎么样 - UNION 子查询将为您提供子查询中的完整结果集。然后你可以说'WHERE condition IN'(子查询)。像这样:

    SELECT [something]
    WHERE
    condition IN
    (SELECT CASE WHEN (another_condition = A AND 3rd Condition = B) THEN C
       WHEN (another_condition = N AND 3rd Condition = E) THEN F
       ELSE J
       END AS Value
    
    UNION
    
    SELECT CASE WHEN (another_condition = A AND 3rd Condition = B) THEN D
       WHEN (another_condition = N AND 3rd Condition = E) THEN G
       ELSE K
       END AS Value
    )
    

    【讨论】:

    • 非常感谢大家的回答,我使用了 G Mastro 的方法,效果很好!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2013-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多