SQL Server 2000實現一則按類似VB VAL函數功能排序的案例
最近,在項目維護時,碰到對以下的資料進行排序處理:
排序前:
班級 照片名稱
機械1班 1張三.jpg
機械1班 7李四.jpg
機械1班 3王五.jpg
財會2班 3如花.jpg
財會2班 6像花.jpg
財會2班 1真花.jpg
體育1班 3鐵男.jpg
體育1班 1猛男.jpg
財會2班 10若花.jpg
體育1班 30衰男.jpg
排序後(要實現的結果):
班級 照片名稱
財會2班 1真花.jpg
財會2班 3如花.jpg
財會2班 6像花.jpg
財會2班 10若花.jpg
機械1班 1張三.jpg
機械1班 3王五.jpg
機械1班 7李四.jpg
體育1班 1猛男.jpg
體育1班 3鐵男.jpg
體育1班 30衰男.jpg
也許有人會說,這還不簡單,只要輸入"SELECT 班級, 照片名稱 FROM [Table] ORDER BY 班級, 照片名稱"語句,不就出結果了嗎?事實如此嗎,請看此SQL語句執行後的結果:
班級 照片名稱
財會2班 10若花.jpg
財會2班 1真花.jpg
財會2班 3如花.jpg
財會2班 6像花.jpg
機械1班 1張三.jpg
機械1班 3王五.jpg
機械1班 7李四.jpg
體育1班 1猛男.jpg
體育1班 30衰男.jpg
體育1班 3鐵男.jpg
是不是與預期的結果有很大的出入呢? 怎樣解決這問題,實現想要的結果呢?由於SQL Server沒有類似VB的VAL函數,因此想實現如上資料的排序,將比較困難。不過,只要執行以下SQL語句就可以了,今天免費贈送了。廢話少說,亮代碼:
SELECT 班級, 照片名稱
FROM (SELECT *, CASE WHEN (UNICODE(SUBSTRING(photo, 1, 1)) BETWEEN 48 AND
57) AND NOT (UNICODE(SUBSTRING(photo, 2, 1)) BETWEEN 48 AND 57)
THEN SUBSTRING(photo, 1, 1) WHEN (UNICODE(SUBSTRING(photo, 1, 1))
BETWEEN 48 AND 57) AND (UNICODE(SUBSTRING(photo, 2, 1)) BETWEEN
48 AND 57) THEN SUBSTRING(photo, 1, 2) END AS photoid
FROM (SELECT *, LTRIM(照片名稱) AS photo
FROM [TABLE]) l) ll
ORDER BY 班級, CAST(ISNULL(photoid, 0) AS int)
沒想到一個簡單的功能,要寫這麼複雜的代碼。看來,前人"造輪子"沒造全,將會給後面的應用開發人員帶來不小的煩惱。