一、order by case when 理解 —— 根據一個字段的多個值進行排序
先看例子: 查詢 user 表,根據用戶狀態排序。狀態為1的排在最前面 >其次是狀態為0 >狀態為4 >狀態為3 >狀態為2 >狀態為6 >狀態為其他的
select * from user where...... order by case when status=1 then 0 when status=0 then 1 when status=4 then 2 when status=3 then 3 when status=2 then 4 when status=6 then 5 when status=5 then 6
else status end ,
查詢結果像如下:
姓名 年齡 性別 狀態 張三 15 男 1 李四 20 男 1 王五 28 男 1 趙六 10 男 0 丁一 14 男 4 劉德華 15 男 4 張愛玲 25 女 3 李世民 20 男 2 楊貴妃 22 女 6 孫悟空 15 男 6 項羽 28 男 5
如果是使用order by case when后,再根據其它條件排序,比如時間,可以繼續加排序條件
1、先說第一個用多個條件進行排序
ORDER BY name,age (多條件排序,還有條件可以再加在后面)
ORDER BY name desc,age asc (不同條件排序規則,先按名字降序排,再按年齡升序排)
2、根據一個條件的多個值,進行排序。
order by case when status=1 then 0 when status=0 then 1 when status=4 then 2 when status=3 then 3 when status=2 then 4 , add_time desc
此句sql的意思是: 先根據用戶狀態排序:狀態為1的排在最前面 >其次是狀態為0 >狀態為4 >狀態為3 >狀態為2 ; 再根據添加時間降序排序。
二、在order By子句中使用case語句的理解
CASE 語句可以在SELECT 子句和ORDER BY 子句中使用
CASE語句分為兩種Case Simple Expression and Case Search Expression
1、Case Simple Expression: CASE Column1 WHEN V1 THEN R1 WHEN V2 THEN R2 ELSE R3 END 2、Case Search Expression CASE WHEN C1=V1 THEN R1 WHEN C2=V2 THEN R2 ELSE R3 END
當在 Order by 中使用Case語句時:
如果排序是按照ASC的話,會將不滿足條件的結果集無序地放在總結果集的前面,然后將滿足條件的結果集排序后附加到總結果集中;
如果使用DESC的話,則將滿足條件的結果集放在總結果集的前面,然后將不滿足條件的結果集無序地附加到總結果集后面。
假設現在項目(project)狀態分為以下幾種:草稿1、已發布2、已下架3、刪除4,現在想要展示已經發布的項目展示在最上面,然后是草稿、已下架、已刪除狀態的項目
select id, name, subject_type_required, created_time from project order by case status when 2 then 1 when 1 then 2 when 3 then 3 when 4 then 4 end asc, created_time desc;
三、ORDER BY 2 DESC 中 2 的理解
示例1:
SELECT last_name, salary , hire_date
FROM EMPLOYEES
ORDER BY salary DESC;
示例2:
SELECT last_name, salary , hire_date FROM EMPLOYEES ORDER BY 2 DESC;
以上兩個示例結果相同:因為ORDER BY salary DESC == ORDER BY 2 DESC,salary是第二個元素,所以可以使用2來代替,但是數字不可以使用0,也不可以超出查詢的列。
例如:select * from employers order by x,如果employers表有九個字段,那個X的范圍就是1 - 9,不能是0,也不能是10。