說我有一個電話有沒有辦法返回按「WHERE IN」值排序的SELECT結果?
SELECT * FROM tablename WHERE id IN (5,3,8,9);
返回在3,5,8,9的ID順序的結果。有沒有辦法讓它返回給定的5,3,8,9順序的結果?
說我有一個電話有沒有辦法返回按「WHERE IN」值排序的SELECT結果?
SELECT * FROM tablename WHERE id IN (5,3,8,9);
返回在3,5,8,9的ID順序的結果。有沒有辦法讓它返回給定的5,3,8,9順序的結果?
SELECT * FROM tablename WHERE id IN (5,3,8,9)
ORDER BY
CASE id
WHEN 5 THEN 1
WHEN 3 THEN 2
WHEN 8 THEN 3
WHEN 9 THEN 4
ELSE 5
END
這有點痛......但它會起作用。謝謝。 – 2014-10-11 05:42:39
您還可以通過使用顯式join
做到這一點:
with vals as (
select 5 as id, 1 as ordering union all
select 3, 2 union all
select 8, 3 union all
select 9, 4
)
select t.*
from tablename t join
vals v
on t.id = v.id
order by v.ordering;
這允許你一次創建列表。
但是,您可以在CTE中使用VALUES表達式而不是所有那些討厭的聯合?如果您使用足夠的括號,則可以加入VALUES表達式,但我不確定是否將其包裝在CTE中。 – 2014-10-11 06:13:58
是的,你可以:http://sqlfiddle.com/#!15/9ca63/4 – 2014-10-11 06:20:23
另一個更靈活的選項,因爲你只需要更改一次ids。
with id_list (id, sort_order) as (
values (5,1), (3,2), (8,3), (9,4)
)
select t.*
from tablename
join id_list l on l.id = t.id
order by l.sort_order;
維護SORT_ORDER然而,如果你需要插入新的ID有點醜陋。
隨着即將到來的9.4,這將是更容易:
with id_list (id, sort_order) as (
select *
from unnest(array[5,3,8,9]) with ordinality
)
select *
from tablename
join id_list l on l.id = t.id
order by l.sort_order;
這可以使用前9.4來完成,但是這依賴這不保證給予UNNEST函數的順序一致的排序(但實際上它似乎總是相同的):
with id_list (id, sort_order) as (
select *, row_number() over()
from unnest(array[5,3,8,9])
)
select *
from tablename
join id_list l on l.id = t.id
order by l.sort_order;
你也許可以加入一個'generate_series'來提供'sort_order'值。 – 2014-10-11 06:21:12
在postgres中,使用POSITION:
SELECT *
FROM tablename
WHERE id IN (5,3,8,9)
ORDER BY POSITION(',' || id || ',' IN ',5,3,8,9,')
在MySQL中,使用FIELD()
功能:
SELECT *
FROM tablename
WHERE id IN (5,3,8,9)
ORDER BY FIELD(id,5,3,8,9)
Postgres – 2014-10-11 06:23:55
@a_horse_with_no_name排序...中沒有'field()'函數,但是+1 2 u 2 – Bohemian 2014-10-11 06:38:07
-- some data
DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;
CREATE TABLE tablename
(id serial PRIMARY KEY
, blah integer
);
INSERT INTO tablename(blah)
select gs
FROM generate_series(1,10) gs;
-- The query
SELECT * FROM tablename t
JOIN (SELECT id
, row_number() OVER() AS rnk
FROM unnest(array[ 5,3,8,9] ) AS id
) val USING(id)
ORDER BY val.rnk
;
結果:
DROP SCHEMA
CREATE SCHEMA
SET
CREATE TABLE
INSERT 0 10
id | blub | rnk
----+------+-----
5 | 5 | 1
3 | 3 | 2
8 | 8 | 3
9 | 9 | 4
(4 rows)
如果'IN'值是一點,你就可以用'ORDER BY CASE'結構。 – 2014-10-11 05:32:30