Order-By

對複雜條件使用 SQL ORDER BY

  • October 29, 2018

假設我的關係是這樣的

在此處輸入圖像描述

我想按等級排序,但首先是 A 和 B。所以我的關係看起來像

在此處輸入圖像描述

起初我試圖只建立兩個關係,我按等級對它們進行排序,然後合併這兩個關係,但它們最終變得混亂在一起。我也嘗試過使用案例,但我不明白它是如何工作的。我不斷收到有關將字元與整數混合的錯誤。

編輯:忘了提到上面的第一個關係是我在查看了一些複雜的視圖後最終得到的。例如,我創建了兩個視圖,一個只有 A 和 B 類,然後我按等級排序。第二個視圖只是 C 類,按等級排序。然後我將他們聯合起來,但他們只是混合在一起。

您只需要 ,CASE中的表達式ORDER BY將行分成兩組,因此將具有“A”或“B”類的行放在第一組 ( 1) 中,將所有其他行放在第二組 ( 2) 中:

ORDER BY 
   CASE WHEN class IN ('A', 'B') THEN 1 ELSE 2 END,
   rank ;

我將舉一個例子來說明一種方法,我使用 CTE,它在許多數據庫中都可用,尤其是我最熟悉的 PostgreSQL。

CTE 和WITH條款

CTE允許您形成類似結構的臨時、單查詢表,但由於您可以使 CTE 在單個查詢中相互依賴,因此它提供了一種方便且易於理解的方式來使您的查詢半過程化。

在你的情況下,我會嘗試

WITH AB_results AS(
 SELECT class, rank, 1 AS hidden_rank
 FROM my_relation
 WHERE class IN ('A','B')
),
Non_AB_results AS(
 SELECT class, rank, 2 AS hidden_rank
 FROM my_relation
 WHERE class NOT IN ('A','B')
)
SELECT COALESCE(AB_results.class,Non_AB_results.class), rank
FROM AB_results
FULL OUTER JOIN Non_AB_results
USING(hidden_rank,rank)
ORDER BY hidden_rank, rank;

我將在幾分鐘內嘗試在這裡組裝一個 SQLFiddle,以確保我的某些查詢沒有出錯。:P

編輯:我確實犯了一個小錯誤。在我們說話的時候試圖在一個例子中清理它。

編輯 2: 錯誤現已更正!不幸的是,SQLFiddle 現在遇到了一些麻煩,但**這裡**是 SQLFiddle 的連結以進行一些測試。

請注意,我可能沒有以最優雅的方式解決這個問題,但它應該可以解決您的問題。

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