SQL中最重要的三列

时间:2016-01-30 16:42:17

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

我想比较多个列,并在不同列中显示最大值

对于三列,我提出了以下查询,该工作正常

SELECT CASE
         WHEN col1 >= col2
              AND col1 >= col3 THEN col1
         WHEN col2 >= col1
              AND col2 >= col3 THEN col2
         WHEN col3 >= col1
              AND col3 >= col2 THEN col3
         ELSE col1
       END AS Max_number 
    FROM   (VALUES (1,2,3),
                   (1,2,3),
                   (1,2,3)) tc (col1, col2, col3) 

但是当我想要比较超过3列时,事情变得越来越复杂。有没有更简单的方法来做到这一点

2 个答案:

答案 0 :(得分:6)

试试这个Table Value Constructor技巧

SELECT (SELECT Max(col)
        FROM   (VALUES (col1),
                       (col2),
                       (col3)) tc(col)) AS Max_number
FROM   (VALUES (1,2,3),
               (1,2,3),
               (1,2,3)) tc (col1, col2, col3) 

此外,它还处理NULL个值

答案 1 :(得分:2)

作为一个注释,使用case的逻辑并不像看起来那么难:

SELECT (CASE WHEN col1 >= col2 AND col1 >= col3 THEN col1
             WHEN col2 >= col3 THEN col2
             ELSE col3 
        END) AS Max_number 
FROM (VALUES (1,2,3),
              (1,2,3),
              (1,2,3)
     ) tc (col1, col2, col3) ;

也就是说,您只需要按照返回的顺序比较值。一旦值不是最大值,它就不需要成为比较的一部分。所以,对于四个值:

SELECT (CASE WHEN col0 >= col1 AND col0 >= col2 AND col0 >= col3 THEN col0
             WHEN col1 >= col2 AND col1 >= col3 THEN col1
             WHEN col2 >= col3 THEN col2
             ELSE col3 
        END) AS Max_number 

我更喜欢VR46建议的方法,但是想指出CASE并不像看起来那么糟糕。