2017-10-13 54 views
1

(對不起,我英文不好)如何ORDER BY列,但陣列來先

我有用戶ID數組如下:

[5, 9, 3, 22, 16] 

顯然,值是動態的。

現在,我需要SELECT所有用戶,但具有上述id的用戶排在第一位。

到目前爲止我試過的是什麼?

該查詢給我確切的答案:

SELECT * FROM users WHERE id IN (5, 9, 3, 22, 16) 
UNION ALL 
SELECT * FROM users WHERE id NOT IN (5, 9, 3, 22, 16); 

但有沒有更好的辦法?

PS:

我使用的PostgreSQL 10.

回答

2

嘗試這種情況:

select * 
from users 
order by id not in (5, 9, 3, 22, 16), id 

the documentation,指出在ORDER BY子句中使用的表達式

可以是由輸入列值組成的任意表達式。

特別是,您可以使用布爾表達式,因爲此類型的值是可排序的。請注意0​​。

+0

我認爲OP首先需要數組中的ID。所以應該是'ID IN(...)' –

+0

nvm我看到你得到0或1,那些'NOT'得到最後:) –

0

您可以在您的訂單使用CASE BY語句,我給你舉個例子:

select * 
from users 
order by 
CASE WHEN id=5 THEN 1 
WHEN id=9 THEN 2 
WHEN id=3 THEN 3 
WHEN id=22 THEN 4 
WHEN id=16 THEN 5 
END, id 

隨着情況下,你可以告訴你的Postgres要爲每個ID「優先級」或價值,如果你知道他們預先。之後,我添加了「id」,以便其餘行得到正確的排序。