我有一个包含两列的'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语句中的整数如何工作?
答案 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
表达式。