2017-09-01 48 views
-1

我有一个“名”两列的表:姓氏,FIRST_NAME什么是“序”的意义在ORDER BY子句CASE条件

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

当我这样做(第1 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 

但是,当我这样做(第2 SQL):

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

还是这个(第三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 

我得到的输出开始姓氏为升序排列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

不,那些3和100只是这里使用的整数值 - 不是序数位置! 3在100之前,即空名称之前的非空名称。 – jarlh

+0

您的大小写表达式对非空名称返回3,对空名称返回100。按该值排序!!! – jarlh

+0

是的,我现在明白了。谢谢:) – riyaB

回答

1

那些不是序号 - 它们只是数字。表达式CASE中的每一个表达式都归结为“用NULL姓氏<some fixed value>和所有非NULL姓氏行<some other fixed value>”分配所有行,然后对这些固定值执行排序。

因此,所有这些CASE表达式都会确保所有的NULL行将显示在非NULL行之前/之后。具体哪种方式取决于您在每个查询中使用的具体固定值。

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

因为这就是ORDER BY子句要求的第二个表达式?

为什么我没有在'CASE WHEN last_name IS NOT NULL THEN 3'中说''ORDER BY子句中的表达式3和last_name是'相同''中的错误?

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


为什么我能够给任何随机号码,如3和100,下CASE声明?按照SQL标准,这个数字只能是任何直到列数的非负整数值。 CASE语句中的整数如何工作?

因为这些都不是序号。为了被认为是一个序数,你必须提供一个常量作为整个order by expression的文字整数 - 不是一个更大的表达式,例如这些CASE表达式。

+0

谢谢达米安。我不明白这些非空名称如何映射到3和NULL名称映射到100? – riyaB

+0

@riyaB - 我不确定我了解你的问题。如果你不明白'CASE'表达是什么,你为什么随机添加它们到你的查询中?如果你明白'CASE'表达的作用,我不确定你怎么可能不清楚'3'和/或'100'是如何分配的。 –

+0

对不起我的错误,我现在明白了。 :) 我仍然认为CASE语句的输出将充当ORDER BY子句的列序号。 它实际上对两类行值进行排序,即null和not null,将它们分配给数字,然后对数字进行排序。 – riyaB