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

SQL Server ORDER BY 進階:自定義排序序列與多層級排序實戰

     編輯:關於SqlServer

業務常需非字母/數字自然序的自定義排序。兩大核心技法:CHARINDEX 字符串位置法、CASE 表達式映射法。

場景:No 列按 '4,1,2' 順序,同組內 ID 降序

CREATE TABLE #T (ID INT, No VARCHAR(10))
INSERT #T VALUES (105,'2'),(105,'1'),(103,'1'),(105,'4')

方案一:CHARINDEX 字符串索引法

SELECT * FROM #T
ORDER BY CHARINDEX(No, '4,1,2')

原理:目標值在序列串中位置越前,索引越小,排序越靠前。需保證值不包含分隔符、無重疊前綴。

方案二:CASE 表達式顯式映射(推薦)

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 含字符串搜尋,相對較慢
  • 大數據量建議:物化排序鍵列(觸發器/計算列維護)+ 索引
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved