【问题标题】:3 level nested sorting3级嵌套排序
【发布时间】:2017-08-01 07:29:22
【问题描述】:

我正在尝试实现 3 级嵌套排序。基本上我有四列:

 A   |  B  |  C  |  D
 --- | --- | --- | ---
 bob | GOOD|  1  |
 kat | BAD |     | 24
 bob | OK  |     | 15
 bob | GOOD|  20 |
 bob | OK  |     | 10
 bob | OK  |  5  | 

我需要三个级别的排序...第一级 A 列 ASC,第二级是 B 列上的大小写排序,第三级我需要根据 C 和 D 中的值进行排序,如果 B = 'GOOD' 并且如果 B 是任何其他值,则基于 C 排序。

我目前拥有的是:

ORDER
    BY A,
    CASE
        WHEN B ='GOOD' THEN 1 
        WHEN B = 'OK' THEN 2 
        WHEN B = 'BAD' THEN 3
    END, C

不过,这只会根据 C 的值对第三级进行排序。

【问题讨论】:

    标签: sql postgresql sorting select sql-order-by


    【解决方案1】:

    如果我猜对了

    ORDER BY A,
        CASE
            WHEN B ='GOOD' THEN 1 
            WHEN B = 'OK' THEN 2 
            WHEN B = 'BAD' THEN 3
        END, C,
        CASE WHEN B ='GOOD' THEN D END
    

    【讨论】:

    • 我实际上需要合并列 C 和 D,然后在 B = 'GOOD' 时进行排序,但这很接近!
    【解决方案2】:

    你可以使用另一个 case 语句:

    ORDER BY A,
             CASE B WHEN 'GOOD' THEN 1 
                    WHEN 'OK' THEN 2 
                    WHEN 'BAD' THEN 3
             END,
             CASE B WHEN 'GOOD' THEN C ELSE D END
    

    在示例数据中,似乎没有任何行同时具有 C 和 D 的值。如果确实如此,您可以使用 coalesce 简化事情:

    ORDER BY A,
             CASE B WHEN 'GOOD' THEN 1 
                    WHEN 'OK' THEN 2 
                    WHEN 'BAD' THEN 3
             END,
             COALESCE(C, D)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-09
      • 2018-11-29
      • 2014-03-16
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-01
      相关资源
      最近更新 更多