SELECT
*
FROM
TABLE
ORDER BY
CASE WHEN STATUS = 2 THEN 0 ELSE 2 END ASC,
STATUS ASC,
CASE WHEN STATUS = 1 THEN end_time
END DESC,
CASE WHEN STATUS = 2 THEN ( CASE WHEN end_time IS NULL THEN appointment_time ELSE end_time END )
END,
CASE WHEN STATUS = 3 THEN start_time
END DESC,
CASE WHEN STATUS = 4 THEN
final_time
END ASC;
分析:
一、CASE WHEN STATUS = 2 THEN 0 ELSE 2 END ASC,
如果status = 2,那就将status视为0,其他的视为4,对status进行升序排序
二、STATUS ASC,
此时status = 2 已经视为 status = 0 了,那再对status 进行一次升序,逻辑上status顺序为:0、1、3、4, 则实际为:2、1、 3、4了。
三、CASE WHEN status = 1 THEN END_TIME END DESC,
已经对status排好序了,现在对不同值的status的数据进行排序。如果 status = 1,按END_TIME做降序。
四、CASE WHEN status = 2 THEN (CASE WHEN END_TIME IS NULL THEN START_TIME ELSE end_time END) END,
如果status = 2,按END_TIME做降序,若END_TIME为空,则按START_TIME降序,这里使用了双层case when,内层的case when 选择出到底用哪个字段排序。
五、CASE WHEN status = 3 THEN START_TIME END DESC,
如果status = 3,按 START_TIME 做降序
六、CASE WHEN status = 4 THEN FINAL_TIME END ASC;
如果status = 4,按 FINAL_TIME 做升序
你还可能用到:
SELECT
id,
name,
Location,
,CASE
WHEN name='张三'
THEN 100
ELSE 1000
END AS MYORDER1
,CASE
WHEN id='2'
THEN 2
ELSE 10
END AS MYORDER2
FROM table
ORDER BY Location , MYORDER1,MYORDER2
--也可以在后面再加入case when 看需求