T-SQL 動態修改排序欄位

這篇主要設法要在T-SQL語法中,如何依使用者條件動態修改排序欄位,筆者提供 3 種解決方式。
筆者遇到一個實例,系統需求是在資料查詢時提供選擇排序欄位,如下圖:
1

由於資料邏輯設計採用預存程序,須盡可能在資料庫這端處理資料排序的方式。
  • 第 1 種作法:在預存程序中組合查詢字串

使用 exec sp_executesql 的方式,範例:

ORDER BY
CASE @ORDER KIND
WHEN '1' THEN CONVERI (char (20) , CUST NA)
WHEN '2' THEN CONVERT (char (8), SRVDI, 112)
WHEN '3ㆍ THEN CONVERI (char (1) , SRVIYPE
ELSE NULL
END


不過組合字串的方式原本就不是一個好主意,增加日後維護的困難度。
  • 第 2 種作法:ORDER BY 搭配CASE WHEN

無意間發現 ORDER BY 還可以CASE WHEN的條件式, 參考: http://www.51bcw.com/article-html-503.htm

ORDER BY
CASE @ORDER KIND
WHEN '1' THEN CONVERI (char (20) , CUST NA)
WHEN '2' THEN CONVERT (char (8), SRVDI, 112)
WHEN '3ㆍ THEN CONVERI (char (1) , SRVIYPE
ELSE NULL
END


此種作法有個小秘技,當CASE WHEN 無法串列多個欄位時,
筆者將各型別均轉型為CHAR後(不是VARCHAR),串接各欄位值為一個長字串做排序比較用如下:


ORDER BY
CASE @ORDER KIND
WHEN '1' THEN CONVERT (char (20) , CUST NA)+'| '+COMVERT (char (8), SRVDI, 112)+'I '+SRVTYPE+' I '+SRVNO
WHEN '2' THEN COMVERI(char (8), SRVDI, 112)+'| 'tCOMERI(char (1) , SRVTYPE)+' l '+SRVNO+' I 'tCOMERI (char (20), CUST_NA)
WHEN '3' THEN CONVERI(char (1) , SRVYPE) +1 I '+CONVERT (char (8), SRVDI, 112)+' | '+SRVNO++CONVERT (char (20), CUST NA)
ELSE NULL
END