【问题标题】:Is there a way to use conditions in case-when statement?有没有办法在 case-when 语句中使用条件?
【发布时间】:2017-07-11 01:07:03
【问题描述】:

我的查询(不会运行):

SELECT * FROM TABLE A
WHERE (case when mode = 1 then Tonnage > 1000
          when mode = 2 then Tonnage > 5000
          else Tonnage < -1
)

我要做的是根据另一列(模式)选择不同的过滤条件(吨位)。

但是,由于&gt;,这将不起作用。

有办法解决吗?

【问题讨论】:

  • 您不能将条件拆分到每个选择语句并通过联合加入数据集?
  • SQL Conditional Where的可能重复

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


【解决方案1】:

你不需要case

where (mode = 1 and Tonnage > 1000) or
      (mode = 2 and Tonnage > 5000) or
      ( (mode not in (1, 2) or mode is null) and Tonnage < -1)

【讨论】:

    【解决方案2】:

    您也可以通过案例陈述来做到这一点,对两者之间的性能结果感到好奇。

    SELECT * 
    FROM TABLE A
    WHERE (case when mode = 1 and Tonnage > 1000 then 1
              when mode = 2 and Tonnage > 5000 then 1
              when tonnage < -1 then 1
              else 0 end
        ) = 1
    

    【讨论】:

    • 计算一个case然后比较它通常比直接表达式效率低,因为优化器不能使用任何过滤器或统计信息。它“必须”计算每行的结果,然后进行比较。 (其实没必要,但由于CASE 的短路逻辑,优化起来会很复杂。)如果您已经在进行表扫描,则差别不大。
    猜你喜欢
    • 2020-07-31
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2023-02-13
    • 2022-08-17
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    相关资源
    最近更新 更多