FIELD(str, val1, val2, val3, ...) -- 回傳 str 在列表中的位置(1-based) -- 找不到或 str 為 NULL → 回傳 0
SELECT * FROM driver_log ORDER BY FIELD(name, 'Suzi', 'Ben', 'Henry');
結果:
| rec_id | name | trav_date | miles |
|---|---|---|---|
| 2 | Suzi | 2006-08-29 | 391 |
| 7 | Suzi | 2006-09-02 | 502 |
| 1 | Ben | 2006-08-30 | 152 |
| 9 | Ben | 2006-09-02 | 79 |
| 5 | Ben | 2006-08-29 | 131 |
| 8 | Henry | 2006-09-01 | 197 |
| 6 | Henry | 2006-08-26 | 115 |
| 4 | Henry | 2006-08-27 | 96 |
| 3 | Henry | 2006-08-29 | 300 |
| 10 | Henry | 2006-08-30 | 203 |
同組內部順序不保證,若需次要排序:
ORDER BY FIELD(name, 'Suzi', 'Ben', 'Henry'), trav_date DESC;
| 方案 | 適用場景 | 效能 | 維護性 |
|---|---|---|---|
FIELD() | 值集固定、< 20 個、臨時查詢 | 全表掃描,無法用索引 | SQL 寫死,修改需改代碼 |
CASE WHEN | 邏輯複雜、需 ELSE | 同 FIELD() | 可讀性較好 |
| 關聯排序表 | 值集動態、> 20 個、生產環境 | 可走索引,JOIN 效能穩定 | 資料驅動,靈活 |
ENUM 內部順序 | 欄位本身是 ENUM | 隱式數值排序 | DDL 修改麻煩 |