我想應該很多人在使用資料庫的時候都想要一個 "自訂排序" 功能吧?
比如說,如果你的資料庫中有一個欄位叫做 Priority,然後存的資料分別為 High, Normal, Low。所以你在撈資料撈時候自然而然就會希望它排序的時候是 High 的排最前面,然後分別是 Normal and Low。但是很不幸的,如果你直接下 Order By Priority 的話,你會得到的順序會是 High, Low and Normal. 因為他會根據英文字母的排序。所以是 H -> L -> N。
不過神奇的 MySQL (我一直覺得 MySQL 是一個很神奇的資料庫,它提供了許多難以想像的便利功能,又有極佳的效能,重點是免費!!) 提供了一個 Function 可以達到這個目的 - Field
Field 這個 Function 的用法如下:
FIELD(str,str1,str2,str3,...)
官網的解釋是
Returns the index (position) of str in the str1, str2, str3, ... list. Returns 0 if str is not found.
而如果你要達成前面所說的目的的話,你可以這樣下你的 SQL
SELECT * FROM Event Order By FIELD( Priority, 'High', 'Normal', 'Low')
為何這樣可以達到目的呢? 因為使用 Field 的時候,它會把 Priority 帶入,並且去比對第二個以後的參數,並回傳該參數的索引 (位置)
所以,如果你的資料是 High,它就會回傳 1,如果是 Low 就回傳 3。當然,如果對應不到的時候,它會回傳 0。這點需要注意,避免發生不預期的結果。