預設 WHERE id IN (4,1,5) 回傳結果會依資料表預設排序(通常是主鍵遞增),而非 IN 列表順序。若需按 4,1,5 這個特定順序輸出,需引入自訂排序鍵。
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)。
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 冗長。
-- 建立排序對照表
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;以此類推
CASE WHEN 最簡潔通用。ORDER BY 中使用函數(如 CHARINDEX)導致掃描。