SQL命令与案例

时间:2014-08-19 07:21:27

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

我遇到了一个带有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子句的含义。谢谢。

5 个答案:

答案 0 :(得分:2)

<强>插图:

假设原始数据是这样订购的

        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

答案 1 :(得分:0)

  

ORDER BY(如果versions.effective_date为NULL,则为1,则为0结束)DESC

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

基本上它将结果分成两个主要部分

  • Top section NULL effective_date
  • Bottom Section NOT NULL effective_date

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

= IF(logical-test,value-if-true,value-if-false)

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

答案 4 :(得分:0)

您的结果将以这种方式订购

  1. 首先显示effective_date为空且当时显示的结果 有effective_date
  2. 的记录
  3. 其次,如果记录的日期为effective_date,则请将其排序 将返回具有更长日期的记录的降序方式
  4. 第三,在与上述订单记录相同的标准中按字母顺序排列 顺序但以递减方式,以便名称以z开头的记录 将首先返回
  5. 最后,在与上述相同的标准下,订单记录更高 id first