【问题标题】:SQL order by with caseSQL order by with case
【发布时间】:2014-08-19 07:21:26
【问题描述】:

我遇到一个带有 ORDER BY 子句的 SQL 语句,我无法理解。

SELECT ...
FROM ...
WHERE ...
JOIN ...
ORDER BY (
        CASE 
            WHEN versions.effective_date IS NULL THEN 
                1 
            ELSE 
                0 
        END) DESC, 
        versions.effective_date DESC, 
        versions.name DESC, 
        versions.id DESC

请指出 ORDER BY 子句的含义。谢谢。

【问题讨论】:

    标签: mysql sql sql-server sql-order-by


    【解决方案1】:

    插图:

    假设原始数据是这样排序的

            effective_date, effective_date, name, id
    
                3/1/2010        3/1/2010     ABC   1
                1/1/2010        1/1/2010     ABC   2
                2/1/2010        2/1/2010     ABC   3
                  NULL            NULL       ABC   4
                  NULL            NULL       ABC   5
                  NULL            NULL       ABC   6
    

    下单后会

            effective_date, effective_date, name, id
    
                  NULL            NULL       ABC   6
                  NULL            NULL       ABC   5
                  NULL            NULL       ABC   4
                3/1/2010        3/1/2010     ABC   1
                2/1/2010        2/1/2010     ABC   3
                1/1/2010        1/1/2010     ABC   2
    

    翻译[订单语句在运行时如何翻译]:

            effective_date, effective_date, name, id
    
                     1            NULL       ABC   6
                     1            NULL       ABC   5
                     1            NULL       ABC   4
                     0          3/1/2010     ABC   1
                     0          2/1/2010     ABC   3
                     0          1/1/2010     ABC   2
    

    【讨论】:

      【解决方案2】:

      ORDER BY (CASE WHEN versions.effective_date IS NULL THEN 1 ELSE 0 END) DESC

      如果 versions.effective_date 不可用 (NULL),则这些记录将是 listed at last。所有其他记录 (NOT NULL) 将显示在 top of the list

      【讨论】:

        【解决方案3】:

        case 子句只是一个额外的按条件排序,生效日期为 null 的每一行的值为 1,其他的值为 0。排序首先发生在该列上,降序。

        【讨论】:

          【解决方案4】:

          您的结果将以这种方式排序

          1. effective_date 为空时先显示结果,然后再显示 记录谁拥有effective_date
          2. 其次,如果记录有 effective_date 日期,则将它们排序 将返回类似日期较大的记录的降序方式
          3. 在与上述字母顺序记录相同的标准内 顺序但以降序方式,因此名称以 z 开头的记录 将首先返回
          4. 最后,在与上述相同的条件下,具有更高的订单记录 身份证第一

          【讨论】:

            【解决方案5】:

            它会将versions.effective_date为NULL的所有行放在列表的顶部。

            基本上是将结果分为两个主要部分

            • 顶部 NULL 有效日期
            • 底部部分 NOT NULL Effective_date

            case expression 类似于 Excel 中的 IF() 函数

            =IF(逻辑测试,真值假,假假真值)

            CASE 
                WHEN versions.effective_date IS NULL -- the logical test
                1 -- value if true
                else 0 -- value if false
            END 
            

            【讨论】:

            • 反之亦然,NULLS 在顶部,因为DESCCASE 之后。
            猜你喜欢
            • 2019-03-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-07-14
            • 1970-01-01
            • 2017-03-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多