# ORDER BY 特定值

一般用 ORDER BY 都是按照欄位的值來排序,看是要 ASC 還是 DESC

像是 ORDER BY id ASC 排序。

SELECT * FROM "user" ORDER BY "id" ASC
id name city
1 王先生 台北
2 吳先生 新北
3 張小姐 台中
4 陳先生 新北
5 李小姐 高雄

如果要將某個值排在第一位,像是說我們要把吳先生排在第一位,可以 ORDER BY "name"='吳先生' DESC

SELECT * FROM "user" ORDER BY "name"='吳先生' DESC
id name city
2 吳先生 新北
1 王先生 台北
3 張小姐 台中
4 陳先生 新北
5 李小姐 高雄

也可以把李小姐排在第二位 ORDER BY "name"='吳先生' DESC, "name"='李小姐' DESC

SELECT * FROM "user" ORDER BY "name"='吳先生' DESC, "name"='李小姐' DESC
id name city
2 吳先生 新北
5 李小姐 高雄
1 王先生 台北
3 張小姐 台中
4 陳先生 新北

也可以再搭配另外的欄位。

SELECT * FROM "user" ORDER BY "name"='吳先生' DESC, "city"='新北' DESC
id name city
2 吳先生 新北
4 陳先生 新北
1 王先生 台北
3 張小姐 台中
5 李小姐 高雄

# 用 ARRAY_POSITION 排序

如果要排的值太多,按照上面的語法串下去的話 ORDER BY "name"='吳先生' DESC, "name"='李小姐' DESC... 語法就會很長,這邊介紹用 ARRAY_POSITION 來排序。

如果要按照吳先生、李小姐、張小姐這樣的排序可以這樣用 ARRAY_POSITION('{"吳先生", "李小姐", "張小姐"}', "name")

SELECT * FROM "user" ORDER BY ARRAY_POSITION('{"吳先生", "李小姐", "張小姐"}', "name")

Knex 可以這樣下

knex('user').orderByRaw(`ARRAY_POSITION(?, name)`, [ "吳先生", "李小姐", "張小姐" ])
id name city
2 吳先生 新北
5 李小姐 高雄
3 張小姐 台中
1 王先生 台北
4 陳先生 新北

那這邊的原理是這樣,用 SELECT ARRAY_POSITION

SELECT *, ARRAY_POSITION('{"吳先生", "李小姐", "張小姐"}', "name") FROM "user"
id name city array_position
1 王先生 台北 null
2 吳先生 新北 1
3 張小姐 台中 3
4 陳先生 新北 null
5 李小姐 高雄 2

可以想像就是多出一個欄位然後用 array_position 來排序。

# 參考資料

贊助商連結
(adsbygoogle = window.adsbygoogle || []).push({});