眾所周知,ORDER BY子句是在子句之后處理的,所以可以使用子句中SELECT的列別名。SELECT
但是,我發現我不能在ORDER BY子句的計算中使用別名列。
WITH data AS(SELECT * FROM (VALUES('apple'),('banana'),('cherry'),('date')) AS sq(item))
SELECT
item AS s
FROM data
-- ORDER BY s; -- OK
-- ORDER BY item ''; -- OK
ORDER BY s ''; -- Fails
我知道有其他方法可以執行此特定查詢,并且我知道這是一個微不足道的計算,但我對為什么列別名在計算中不起作用感興趣。
我已經在 PostgreSQL、MariaDB、SQLite 和 Oracle 中進行了測驗,它按預期作業。SQL Server 似乎是一個奇怪的問題。
uj5u.com熱心網友回復:
該檔案明確指出:
ORDER BY 子句中參考的列名必須對應于選擇串列中的列或列別名,或者對應于 FROM 子句中指定的表中定義的列,沒有任何歧義。如果 ORDER BY 子句參考選擇串列中的列別名,則必須單獨使用列別名,而不是作為ORDER BY 子句中某些運算式的一部分:
從技術上講,您的查詢應該可以作業,因為 order by 子句在 select 子句之后進行邏輯評估,并且它應該可以訪問 select 子句中宣告的所有運算式。但是沒有看著 可以訪問 SQL 規范,我無法評論它是 SQL Server 的限制還是其他 RDBMS 將其作為獎勵功能實作的限制。
無論如何,您可以將CROSS APPLY其用作技巧....它是FROM子句的一部分,因此運算式應該在所有后續子句中都可用:
SELECT item
FROM t
CROSS APPLY (SELECT item '') AS CA(item_for_sort)
ORDER BY item_for_sort
uj5u.com熱心網友回復:
這僅僅是由于運算式的評估方式。一個更具說明性的例子:
;WITH data AS
(
SELECT * FROM (VALUES('apple'),('banana')) AS sq(item)
)
SELECT item AS s
FROM data
ORDER BY CASE WHEN 1 = 1 THEN s END;
這將回傳相同的Invalid column name錯誤。在決議選擇串列中的別名之前評估CASE運算式(以及在更簡單的情況下的串聯)。s ''
對于更簡單的情況,一種解決方法是在選擇串列中附加空字串:
SELECT
item '' AS s
...
ORDER BY s;
還有更復雜的方法,比如使用派生表或 CTE:
;WITH data AS
(
SELECT * FROM (VALUES('apple'),('banana') AS sq(item)
),
step2 AS
(
SELECT item AS s FROM data
)
SELECT s FROM step2 ORDER BY s '';
這正是 SQL Server 的作業方式,我想你可以說“SQL Server 是因為這個不好”,但 SQL Server 也可以說“這個用例到底是什么?” :-)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/410562.html
標籤:
上一篇:ODBC命令程序函式需要引數
