2012-04-22 64 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,结果应该是您想要的。