在进行查询时保留订单

时间:2012-04-22 07:33:41

标签: sql

我有这个查询,我想保留订单

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

现在我希望按顺序输入一个值,我的意思是a表示2表示后跟a表示45后跟表示87表示。如何在sql中完成此操作

2 个答案:

答案 0 :(得分: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)

在不支持FIELD的数据库中,您可以改为使用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

答案 1 :(得分:0)

如果您的id值来自另一个查询,并且它们的顺序很重要,那么该查询必须有自己的ORDER BY子句,该子句以正确的顺序生成ID。然后,您可以使用此ORDER BY子句使用连接而不是IN子句。这是一个标准的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,那么结果应该是你想要的。