获取合并的CASE语句的最大值

时间:2019-02-15 19:09:12

标签: sql sql-server

我有4条CASE语句,我想知道如何只显示计算的最大值。

我尝试将CASE语句与COALESCE函数结合使用。

SELECT
ID,
CASE 
    WHEN tw.displayText IN ('A','B','C') THEN 'A1'
    WHEN tw.displayText IN ('D','E','F') THEN 'A2'
    WHEN tw.displayText IN ('G','H','I') THEN 'A3'
    ELSE NULL
    END AS COL1

如果COL1可以全部取3(A3IDA1),怎么使A2成为A3

ID COL1
1  A1
1  A2
1  A3

ID COL1
1  A3

3 个答案:

答案 0 :(得分:1)

尽管您的问题的措词尚不清楚,但如果今天我的心智阅读技巧很重要,我认为这就是您所需要的:

<header>

为什么?因为对单个CASE表达式进行求值,以使第一个WHEN(从上至下)求值为true的是表达式将返回的WHEN。其余的将被忽略。

因此,在此表达式中,如果将导致“ 3”的条件为真,则将返回“ 3”,而其他条件将被忽略。如果“ 3”不为真,则检查“ 2”的条件。依此类推。

现在,如果您打算使用GROUP BY并实际获得Aggregate,则需要将整个CASE..END表达式包装在MAX()函数中。

答案 1 :(得分:1)

SQL Server没有greatest()least()函数。但是您可以在from子句中使用apply进行此操作:

select COL1
from tw cross apply
     (select max(val) as col1
      from (values (CASE WHEN tw.displayText IN ('A','B','C') THEN 1 END),
                   (CASE WHEN tw.displayText IN ('D','E','F') THEN 2 END),
                   (CASE WHEN tw.displayText IN ('G','H','I') THEN 3 END)
           ) v(val)
     ) v;

也许还有其他方式来表达这一点。这是一个非常通用的解决方案。

答案 2 :(得分:0)

我认为您只需要一个 [Tag1](x) | [Tag3](x) 的{​​{1}}表达式:

case

max()确实是不必要的,因为SELECT MAX(CASE WHEN tw.displayText IN ('A','B','C') THEN 1 THEN 1 WHEN tw.displayText IN ('D','E','F') THEN 2 THEN 2 WHEN tw.displayText IN ('G','H','I') THEN 3 THEN 3 END) AS COL1 表达式仅返回单个值,并且只要它们中的任何一个条件成立就将只计算一次。