業務常需非字母/數字自然序的自定義排序。兩大核心技法:CHARINDEX 字符串位置法、CASE 表達式映射法。
CREATE TABLE #T (ID INT, No VARCHAR(10))
INSERT #T VALUES (105,'2'),(105,'1'),(103,'1'),(105,'4')
SELECT * FROM #T
ORDER BY CHARINDEX(No, '4,1,2')
原理:目標值在序列串中位置越前,索引越小,排序越靠前。需保證值不包含分隔符、無重疊前綴。
SELECT * FROM #T
ORDER BY CASE No WHEN '4' THEN 1 WHEN '1' THEN 2 WHEN '2' THEN 3 ELSE 4 END, ID DESC
優點:語義清晰、可擴展、支持多層級排序(CASE 排第一鍵,ID 排第二鍵)、不依賴字符串構造技巧。
DECLARE @Seq VARCHAR(100) = '4,1,2'
SELECT * FROM #T
ORDER BY CHARINDEX(','+No+',', ','+@Seq+',')
將序列外部化為參數/配置表,實現「不改代碼調整排序」。
CASE 為標量運算,極快,可利用索引(若排序列有索引)CHARINDEX 含字符串搜尋,相對較慢