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