具有CASE条件的ORDER BY子句中“序数”的含义是什么?

时间:2017-09-01 07:26:28

标签: sql sql-order-by case

我有一个包含两列的'names'表:last_name,first_name

last_name  first_name
---------  ----------
Basu       Rohini
Khan       Amartya
Nandy      Upanita
Ghosh      Shankha
NULL       Claire
NULL       Amelie

当我这样做时(第一个SQL):

    SELECT last_name, first_name FROM names
    ORDER BY
        CASE 
            WHEN last_name IS NOT NULL THEN 3
            ELSE 100
        END,
        last_name DESC

我得到了一个输出:

last_name  first_name
---------  ----------
Nandy      Upanita
Khan       Amartya
Ghosh      Shankha
Basu       Rohini
NULL       Amelie
NULL       Claire

但是当我这样做时(第二个SQL):

    SELECT last_name, first_name from names
    ORDER BY
        CASE 
            WHEN last_name IS NOT NULL THEN 3
        END,
        last_name DESC

或者这个(第3个SQL):

    SELECT last_name, first_name from names
    ORDER BY
        CASE 
            WHEN last_name IS NOT NULL THEN 100
            ELSE 3
        END,
        last_name DESC

我的输出以last_name开头为NULL,first_name以升序开头,后跟非空的last_names,按降序排列:

last_name  first_name
---------  ----------
NULL       Amelie
NULL       Claire
Nandy      Upanita
Khan       Amartya
Ghosh      Shankha
Basu       Rohini

我的问题:

  • 为什么第一个SQL给出的last_name输出以递减的方式排序,对于非空的姓氏?

  • 为什么我没有在第一个SQL中收到'CASE WHEN last_name IS NOT NULL THEN 3'时出现错误,说'ORDER BY子句中的表达式3和last_name是相同的'?

  • 为什么我能在CASE声明下提供3和100等随机数字?根据SQL标准,此数字只能是任何非负整数值,直到列数。 CASE语句中的整数如何工作?

1 个答案:

答案 0 :(得分:1)

这些不是序数 - 它们只是数字。您的每个CASE表达式实质上归结为“为所有行分配NULL姓氏<some fixed value>以及所有非NULL姓氏行{{1然后对这些固定值执行排序。

所以这些<some other fixed value>表达式所做的就是确保所有CASE行都出现在非NULL行之前/之后。具体方法取决于您在每个查询中使用的具体固定值。

  

为什么第一个SQL给出的last_name输出以递减的方式排序,对于非空的姓氏?

因为这是NULL子句中第二个表达式要求的内容吗?

  

为什么我没有在第一个SQL中收到'CASE WHEN,而last_name IS NOT NULL THEN 3',说'ORDER BY子句中的表达式3和last_name是相同的'?

因为表达式不一样,即使它们是相同的,SQL也不会阻止你要求冗余/无意义的排序(即你可以在ORDER BY子句中指定比需要更多的表达式唯一确定每一行的最终输出位置并且不会产生错误)

  

为什么我能在CASE声明下提供3和100这样的随机数?根据SQL标准,此数字只能是任何非负整数值,直到列数。 CASE语句中的整数如何工作?

因为,这些不是全国性的。为了被视为序数,您必须提供常量字面整数作为整个ORDER BY - 而不是更大的表达式,例如这些order by expression表达式。