# 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
贊助商連結
贊助商連結