2017-09-01 77 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