T-SQL 動態修改排序欄位
這篇主要設法要在T-SQL語法中,如何依使用者條件動態修改排序欄位,筆者提供 3 種解決方式。
筆者遇到一個實例,系統需求是在資料查詢時提供選擇排序欄位,如下圖:
筆者遇到一個實例,系統需求是在資料查詢時提供選擇排序欄位,如下圖:
由於資料邏輯設計採用預存程序,須盡可能在資料庫這端處理資料排序的方式。
不過組合字串的方式原本就不是一個好主意,增加日後維護的困難度。
-
第 1 種作法:在預存程序中組合查詢字串
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 @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),串接各欄位值為一個長字串做排序比較用如下:
筆者將各型別均轉型為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