# 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 來排序。
# 參考資料
LikeCoin
 贊助商連結
 贊助商連結
 