2014-10-11 30 views

回答

3
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 

Fiddle

+0

這有點痛......但它會起作用。謝謝。 – 2014-10-11 05:42:39

1

您還可以通過使用顯式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; 

這允許你一次創建列表。

+0

但是,您可以在CTE中使用VALUES表達式而不是所有那些討厭的聯合?如果您使用足夠的括號,則可以加入VALUES表達式,但我不確定是否將其包裝在CTE中。 – 2014-10-11 06:13:58

+1

是的,你可以:http://sqlfiddle.com/#!15/9ca63/4 – 2014-10-11 06:20:23

4

另一個更靈活的選項,因爲你只需要更改一次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; 
+0

你也許可以加入一個'generate_series'來提供'sort_order'值。 – 2014-10-11 06:21:12

0

在postgres中,使用POSITION:

SELECT * 
FROM tablename 
WHERE id IN (5,3,8,9) 
ORDER BY POSITION(',' || id || ',' IN ',5,3,8,9,') 

SQLFiddle


在MySQL中,使用FIELD()功能:

SELECT * 
FROM tablename 
WHERE id IN (5,3,8,9) 
ORDER BY FIELD(id,5,3,8,9) 

SQLFiddle

+0

Postgres – 2014-10-11 06:23:55

+0

@a_horse_with_no_name排序...中沒有'field()'函數,但是+1 2 u 2 – Bohemian 2014-10-11 06:38:07

0

你試試這種替代也

select * 
from Table1 
where id in (5,3,8,9) 
order by position(id::text in '5,3,8,9') 

sqlfiddle


position

+1

如果你有一個id爲'5'和'55'的'55'應該是不行的被排序_before_'5' – 2014-10-11 06:40:49

+0

'id = 1'和'IN(10,1)'不會失敗嗎? – beerbajay 2014-10-11 06:40:51

0
-- 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) 
相關問題