Sql-Server

按零排序如何工作

  • December 19, 2021

在以下腳本中(請參閱此處的完整展示):

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子句下使它起作用,但我不明白為什麼以及如何?

當您使用表達式(例如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 排序,因此它們在該排序中的順序將是不確定的)並且所有空行也將一起排序。

引用自:https://dba.stackexchange.com/questions/305155