Sql-Server
按零排序如何工作
在以下腳本中(請參閱此處的完整展示):
SELECT * FROM Table1 ORDER BY CASE WHEN Field1 IS NOT NULL THEN 0 END
- 的類型是
0
什麼?- 是如何
0
解釋的?不是選擇列表中列的序號,因為選擇列表列舉是從 1 開始的,而不是 0。那麼它是什麼?為了詳細說明,將上面的程式碼段與以下程式碼段進行比較,它會發出錯誤:
SELECT * FROM Table1 ORDER BY 0
ORDER BY 位置編號 0 超出了選擇列表中的項目數範圍。
並將其與以下程式碼段進行比較,該程式碼段會發出另一個錯誤:
SELECT * FROM Table1 ORDER BY '0'
在 ORDER BY 列表的位置 1 中遇到常量表達式。
似乎將
0
值嵌套在case
子句下使它起作用,但我不明白為什麼以及如何?
- 這個問題在某種程度上是這個舊問題的後續問題,與我上面列出的替代方案相比,它沒有解釋為什麼它可以 工作:SQL 如何使用 order by 0?
當您使用表達式(例如
CASE
)時,它不再按列名或列序號排序,而是現在按值排序。在這種情況下,您選擇的值是 0(僅適用於非空Field1
行),但它可能是 1、100、‘Red’ 甚至FieldSomethingElse
.如果你
CASE
進一步建構你的表達,你會明白我的意思:SELECT * FROM Table1 ORDER BY CASE WHEN Field1 > 10 THEN 100 WHEN Field1 > 5 THEN 200 WHEN Field1 IS NOT NULL THEN 300 ELSE 900 END
Field1
以上根據 的值是否大於某個值對行進行半降序排序。它還有一個預設情況,即ELSE
子句,它將所有行放在Field1 IS NULL
結果的末尾。顯然,沒有列的名稱或序數為 100、200、300 或 900,但上述
CASE
表達式有效,因為 SQL Server 按子句中滿足該子句的行的值對行進行排序。THEN``WHEN
當您使用 0 時,在您的範例子句中發生了同樣的事情
CASE
,它只是對常量值 0 上的非空行進行排序。這顯然在排序方面沒有多大意義,除了所有非空行都將被排序一起(因為它們都將按相同的值 0 排序,因此它們在該排序中的順序將是不確定的)並且所有空行也將一起排序。