2012-04-22 100 views
2

,我想保留保留的順序進行查詢時

SELECT a FROM TABLE WHERE id in (2,45, 87, 10,12, 41, 29) 

現在我想接着是在隨後是45的順序我指的是2的一個值的順序我有這個疑問87.我怎樣才能做到這一點在SQL

+2

您使用的是哪個數據庫? – JohnFx 2012-04-22 07:40:41

回答

5

在MySQL中,你可以使用ORDER BY FIELD

SELECT a 
FROM yourtable 
WHERE id IN (2, 45, 87, 10, 12, 41, 29) 
ORDER BY FIELD (id, 2, 45, 87, 10, 12, 41, 29) 

在不支持字段,你可以使用CASE表達式,而不是數據庫:

SELECT a 
FROM yourtable 
WHERE id IN (2, 45, 87, 10, 12, 41, 29) 
ORDER BY CASE 
    WHEN id = 2 THEN 1 
    WHEN id = 45 THEN 2 
    WHEN id = 87 THEN 3 
    WHEN id = 10 THEN 4 
    WHEN id = 12 THEN 5 
    WHEN id = 41 THEN 6 
    WHEN id = 29 THEN 7 
END 
+0

是的,這是一種可能性,但在我的情況下,ids是由另一個查詢,如SELECT ID FROM TABLE 2 WHERE條件生成的。那麼我怎麼能包括這個以及 – user9093 2012-04-22 10:40:51

+0

@ user9093:在你的情況下,ID不會以任何特定的順序進來。如果您有特定的訂單(例如插入日期),您可以使用JOIN並通過appopriate列進行訂購。但看起來你沒有這個,所以除非你添加缺失的列,否則你可以做任何事情。 – 2012-04-22 11:05:50

0

如果您的id值來自另一個查詢,並且它們的順序很重要,那麼該查詢必須具有自己的ORDER BY子句,以正確的順序生成該id。然後,您可以使用連接而不是IN子句,並使用此ORDER BY子句。這是一個標準的SQL查詢來做到這一點。

with SelectIDs(id,position) as (
    select 
    id, 
    row_number() over (
     order by columnA, columnB 
    ) 
    from table2 
    where <your where condition> 
) 
    select T.* 
    from yourTable as T 
    join SelectIDs as I 
    on I.id = T.id 
    order by I.position; 

如果您匹配的ID不是NULL而不是NULL,結果應該是您想要的。