首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL 自訂排序技巧:依指定 ID 順序輸出查詢結果

     編輯:關於SqlServer

問題場景

預設 WHERE id IN (4,1,5) 回傳結果會依資料表預設排序(通常是主鍵遞增),而非 IN 列表順序。若需按 4,1,5 這個特定順序輸出,需引入自訂排序鍵。

解決方案對比

方法一:CHARINDEX + 字串搜尋(SQL Server 適用)

SELECT *
FROM RuQi
WHERE id IN (4,1,5)
ORDER BY CHARINDEX(',' + LTRIM(STR(id)) + ',', ',4,1,5,');

原理:將 id 轉為帶分隔符的字串 ,4, ,1, ,5,,在基準字串 ,4,1,5, 中尋找位置,位置越前排序越前。
優點:單一查詢、無需臨時表。
缺點:字串操作無法使用索引,大資料量效能差;需注意型別轉換(STR/CAST)。

方法二:CASE WHEN 明對應(通用 ANSI SQL)

SELECT *
FROM RuQi
WHERE id IN (4,1,5)
ORDER BY CASE id WHEN 4 THEN 1 WHEN 1 THEN 2 WHEN 5 THEN 3 ELSE 4 END;

優點:語法標準、可讀性高、最佳化器易優化。
缺點:列表長時 SQL 冗長。

方法三:臨時表/表值參數 JOIN(大清單、高效能)

-- 建立排序對照表
CREATE TABLE #SortOrder (id INT PRIMARY KEY, seq INT);
INSERT INTO #SortOrder VALUES (4,1), (1,2), (5,3);

SELECT r.*
FROM RuQi r
JOIN #SortOrder s ON r.id = s.id
ORDER BY s.seq;

優點:可利用索引、支援超大排序清單、應用層可批次傳入 TVP。
適用場景:前端傳入幾百個 ID 需按特定順序顯示。

多欄位排序補充

SELECT * FROM table
ORDER BY col1, col2, col3;
-- 依 col1 排序;col1 相同則依 col2;以此類推

最佳實務建議

  • 短清單(< 20 項):用 CASE WHEN 最簡潔通用。
  • 長清單或高頻查詢:用臨時表/TVP JOIN,確保穩定執行計畫。
  • 避免在 ORDER BY 中使用函數(如 CHARINDEX)導致掃描。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved