業務常需按非字母/數值順序排序,如訂單狀態:3-已發貨、4-已完成、0-待付款、2-已取消、1-處理中。MySQL FIELD() 函數完美解決此類需求。
SELECT * FROM orders
ORDER BY FIELD(status, 3, 4, 0, 2, 1);
status:排序依據欄位3, 4, 0, 2, 1:期望的排序優先級序列,值越靠前優先級越高status 在列表中的位置索引(從 1 開始)ORDER BY FIELD(priority, 'high', 'medium', 'low')
ORDER BY FIELD(status, 3, 4, 0, 2, 1), create_time DESC
SELECT status, COUNT(*)
FROM orders
GROUP BY status
ORDER BY FIELD(status, 3, 4, 0, 2, 1);
FIELD() 不會使用索引,大表建議:sort_order 列,維護排序權重,走索引排序FIELD() 影響可忽略MySQL 專有函數,MariaDB 完整支援。PostgreSQL 可用 CASE WHEN 或 array_position() 替代;SQL Server 使用 CHARINDEX 或 CASE;Oracle 使用 DECODE 或 CASE。