【问题标题】:Oracle : select maximum value from different columns of the same rowOracle:从同一行的不同列中选择最大值
【发布时间】:2010-05-28 10:06:04
【问题描述】:

整个问题几乎都在标题中。对于表的每一行,我想选择列子集的最大值。

例如,从这个表

name m1 m2 m3 m4
A    1  2  3  4
B    6  3  4  5
C    1  5  2  1

结果是

name max
A    4
B    6
C    5

查询必须兼容 oracle 8i。

【问题讨论】:

    标签: sql oracle oracle8i


    【解决方案1】:

    鉴于此测试数据...

    SQL> select *
      2  from your_table
      3  /
    
    NAME         M1         M2         M3         M4
    ---- ---------- ---------- ---------- ----------
    A             1          2          3          4
    B             6          3          4          5
    C             1          5          2          1
    
    SQL>
    

    ...一个简单的 GREATEST() 调用将给出所需的结果:

    SQL> select name
      2          , greatest(m1, m2, m3, m4) as the greatest_m
      3  from your_table
      4  /
    
    NAME THE_GREATEST_M
    ---- --------------
    A                 4
    B                 6
    C                 5
    
    SQL>
    

    请注意,如果任何参数为空,greatest() 将返回 NULL。如果这是一个问题,那么使用nvl() 提供一个不会扭曲结果的默认值。例如,如果没有值可以是负数......

    SQL> select name
      2          , greatest(nvl(m1,0), nvl(m2,0), nvl(m3,0), nvl(m4,0)) as the greatest_m
      3  from your_table
      4  /
    
    NAME THE_GREATEST_M
    ---- --------------
    A                 4
    B                 6
    C                 5
    
    SQL>
    

    【讨论】:

    • +1 哇!自从 7.3.4 是新版本以来,我一直在使用 Oracle,甚至不知道该功能的存在。
    • @MarkBaker - 它是在 Oracle8.0 中引入的。
    • @DaveCosta - 它不在 7.0 手册中,所以我们应该分开区别吗?
    • 只是一个警告,如果任何一列是 NULL,最大将总是返回 NULL
    【解决方案2】:

    使用GREATEST但也处理可能的NULL

    SELECT name, GREATEST(NVL(m1,0), NVL(m2,0), NVL(m3,0), NVL(m4,0)) AS "Max"
    FROM yourtable
    

    输入:

    name m1 m2 m3 m4
    A    1  2  3  4
    B    6  3  4  5
    C    1  5  2  1
    

    输出:

    NAME Max
    A    4
    B    6
    C    5
    

    SQL 小提琴:http://sqlfiddle.com/#!4/ae268/7/0

    输入:

    name m1 m2   m3 m4
    A    1  2    3  null
    B    6  null 4  5
    C    1  5    2  1
    

    输出:

    NAME Max
    A    3
    B    6
    C    5
    

    SQL 小提琴:http://sqlfiddle.com/#!4/b1c46/1/0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      相关资源
      最近更新 更多