如何用sql實現自己想要的order排序

  • 2019 年 10 月 8 日
  • 筆記

一、需求背景

萬惡的產品經理,在不同場景有不同的排序需求,有時候根據欄位 0 1 2 升序 ,有時候又是1 2 0 這樣排序,重點是還要分頁,就無法使用程式碼去實現排序,只能用純sql語句。

假設現在有一個訂單表,表裡有個欄位為pay_status,0為未支付,1為已支付,2為支付失敗

如果按照 支付失敗->已支付->未支付(2,1,0)  排序,使用以下sql語句即可

select * from table_order order by pay_status desc

但是想按照 已支付->支付失敗->未支付(1,2,0) 排序,就不能簡單地根據這個欄位使用desc或者asc了。

二、FIELD()函數

FIELD(str,str1,str2,str3,…)

返回str 在str1, str2, str3, …列表其中的索引(位置從1開始)。如果str沒有找到,返回0。

SQL> SELECT FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo');  +---------------------------------------------------------+  | FIELD('ej', 'Hej', 'ej', 'Heja', 'hej', 'foo')          |  +---------------------------------------------------------+  | 2                                                       |  +---------------------------------------------------------+  1 row in set (0.00 sec)

解決思路:使用原值進行對比,生成一個新的值,再根據此值排序

select * from table_order order by FIELD(pay_status,1,2,0) asc

三、IF()函數

IF(expr1,expr2,expr3)

sva=1;    IF(sva=1,"男","女");    男

解決思路:先判斷某個值是否為目標值,先進行第一遍排序,然後再對剩餘值排序

select * from table_order order by IF(pay_status=1,1,0) asc,pay_status desc
Exit mobile version