2017-08-05 51 views
0

ORDER BY中的數字引用SELECT列表中的列序數位置。 所以下面的查詢是等同於「C.custid,C.region」排序:使用CASE語句處理ORDER BY中的數字

SELECT 
C.custid, C.region 
FROM SALES.Customers AS C 
ORDER BY 1, c.region 

現在,如果我使用一個CASE語句這樣的,我想在地區列中的NULL值的最後排序,那麼我會做這樣的事情:

SELECT 
C.custid, C.region 
FROM SALES.Customers AS C 
ORDER BY CASE WHEN C.region IS NULL THEN 1 ELSE 0 END, C.region 

在這種情況下,數字被視爲列不是順序位置,但幫助改變排列順序爲硬編碼值。

如果我的理解是正確的,爲什麼這種差異?它背後的原因?

由於

+0

在第一種情況下,將'1'視爲值是沒有意義的,因爲它總是相同的,而case語句可能返回不同的值 – FuzzyTree

回答

2

如文檔中解釋了order by

order_by_expression

指定要排序的查詢結果集中列或表達式。可以將排序列指定爲名稱或 列別名,或指定選擇列表中列的位置爲 的非負整數。

這裏的關鍵是代表 的位置的列非負整數,不表達

一個表達式可以用於排序,但是如果碰巧現在選擇了一列,並且如果表達式值在選擇列表中的列數內,您會不會感到驚訝?

解析語句時,數據庫需要在位置列或要排序的表達式之間進行明確區分,例如, Checksum(HatSize)。在這種情況下,規則是一個整數常量按位置指定一列,任何其他表達式不管數據類型如何。列名稱或Len(Name)指定要排序的值。

還要注意:

最佳實踐

避免指定在ORDER BY整數子句在選擇列表中列的位置 表示。

+0

1)感謝您提出它,但我確實知道最好的圍繞這個練習。 2)case語句返回表達式,在這種情況下,表達式的類型被解析爲一個整數常量(https://docs.microsoft.com/en-us/sql/t-sql/language-elements/expressions- transact-sql和https://docs.microsoft.com/en-us/sql/t-sql/data-types/constants-transact-sql)。所以這種差異在這種情況下非常微妙,但可以用來解釋這種行爲。謝謝 – umbersar

+0

我已經添加到答案重新:解析。當文檔中顯示「整數」時,它表示一個[整數常量](https://docs.microsoft。com/en-us/sql/t-sql/data-types/constants-transact-sql),而不是一個表達式,其值爲整數類型。在['CREATE [OR ALTER] {PROC | PROCEDURE} [schema_name。] procedure_name [;數字]'](https://docs.microsoft.com/en-us/sql/t-sql/statements/create-procedure-transact-sql)很少使用_number_是一個「可選的整數」。這是另一個表達無法理解的地方,但是一個整數有目的。 – HABO