Sql '的意义是什么;序数';在带有案例条件的ORDER BY子句中

Sql '的意义是什么;序数';在带有案例条件的ORDER BY子句中,sql,sql-order-by,case,Sql,Sql Order By,Case,我有一个“名称”表,有两列:姓、名 last_name first_name --------- ---------- Basu Rohini Khan Amartya Nandy Upanita Ghosh Shankha NULL Claire NULL Amelie 当我在做(第一个SQL)时: 我得到一个输出: last_name first_name --------- ---------- Nandy

我有一个“名称”表,有两列:姓、名

last_name  first_name
---------  ----------
Basu       Rohini
Khan       Amartya
Nandy      Upanita
Ghosh      Shankha
NULL       Claire
NULL       Amelie
当我在做(第一个SQL)时:

我得到一个输出:

last_name  first_name
---------  ----------
Nandy      Upanita
Khan       Amartya
Ghosh      Shankha
Basu       Rohini
NULL       Amelie
NULL       Claire
但当我这样做时(第二个SQL):

或者这个(第三个SQL):

我将得到一个输出,以姓氏为NULL,姓氏升序,非NULL姓氏降序:

last_name  first_name
---------  ----------
NULL       Amelie
NULL       Claire
Nandy      Upanita
Khan       Amartya
Ghosh      Shankha
Basu       Rohini
我的问题是:

  • 为什么第一个SQL给出了一个姓氏按降序排列的输出,对于非空的姓氏

  • 为什么我在第一个SQL中没有得到“CASE WHEN last_name not NULL THEN 3”的错误,它说“表达式3和last_name在ORDER BY子句中是相同的”

  • 为什么我能在案例陈述中给出3和100这样的随机数?根据SQL标准,此数字只能是任何非负整数值,最大为列数。CASE语句中的整数是如何工作的


那些不是序数——它们只是数字。每个
CASE
表达式本质上归结为“为所有行分配
NULL
姓氏
和所有非
NULL
姓氏行
”,然后对这些固定值执行排序

因此,这些
CASE
表达式所做的就是确保所有
NULL
行都出现在非NULL行之前/之后。具体采用哪种方法取决于在每个查询中使用的特定固定值

为什么第一个SQL给出了一个姓氏按降序排列的输出,对于非空的姓氏

因为这就是
orderby
子句中的第二个表达式所要求的

为什么我在第一个SQL中没有得到“CASE WHEN last_name not NULL THEN 3”的错误,它说“表达式3和last_name在ORDER BY子句中是相同的”

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


为什么我能在案例陈述中给出3和100这样的随机数?根据SQL标准,此数字只能是任何非负整数值,最大为列数。CASE语句中的整数是如何工作的


因为,同样,这些不是序数。为了被视为序数,您必须提供一个常量文字整数作为整个
按表达式排序
-而不是更大的表达式,例如这些
大小写
表达式。

不,这些3和100只是此处使用的整数值-不是序数位置!3在100之前,即非空名称在空名称之前。您的case表达式为非空名称返回3,为空名称返回100。按该值订购!!!是的,我现在知道了。谢谢:)谢谢达米恩。我不明白这些非空名称如何映射到3,空名称如何映射到100?@riyaB-我不确定我是否理解你的问题。如果您根本不理解
CASE
表达式的作用,为什么要将它们随机添加到查询中?如果您确实了解
案例
表达式的作用,我不确定您如何不清楚
3
和/或
100
是如何分配的。对不起,我弄错了,我现在知道了。:)我仍然认为CASE语句的输出将充当orderby子句的列序号。它实际上是对两类行值进行排序,即null和NOTNULL,将它们分配给数字,然后对数字进行排序。
    SELECT last_name, first_name from names
    ORDER BY
        CASE 
            WHEN last_name IS NOT NULL THEN 3
        END,
        last_name DESC
    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  first_name
---------  ----------
NULL       Amelie
NULL       Claire
Nandy      Upanita
Khan       Amartya
Ghosh      Shankha
Basu       Rohini