如何使用IN命令保留SQL查询的顺序

时间:2013-03-01 10:50:46

标签: sql sqlite

SELECT * FROM tblItems
WHERE itemId IN (9,1,4)

以SQL找到它们的顺序返回(恰好是1,4,9)但是,我希望它们按照我在数组中指定的顺序返回。

我知道我可以用我的母语(obj c)对它们进行重新排序,但是在SQL中有一种巧妙的方法吗?

这样的事情会很棒:

ORDER BY itemId (9,1,4) --    <-- this dosn't work :)

5 个答案:

答案 0 :(得分:5)

执行此操作的最佳方法可能是创建项目ID表,其中还包括排名顺序。然后你可以按排名顺序加入和排序。

创建一个这样的表:

 itemID rank
 9      1
 1      2
 4      3

然后您的查询将如下所示:

select tblItems.* from tblItems
    inner join items_to_get on
        items_to_get.itemID = tblItems.itemID
    order by rank

答案 1 :(得分:2)

使用CASE expression将ID值映射到递增序列:

... ORDER BY CASE itemId
             WHEN 9 THEN 1
             WHEN 1 THEN 2
             ELSE        3
             END

答案 2 :(得分:1)

您可以在select子句中添加case构造。

select case when itemid = 9 then 1
when itemid = 1 then 2 else 3 end sortfield
etc
order by sortfield

答案 3 :(得分:1)

我在mysql环境中执行过相同的任务。

我最终使用

ORDER BY FIND_IN_SET(itemID, '9,1,4')

从那时起,这对我有用。我希望它也适用于sqlite

答案 4 :(得分:0)

您可以创建一个在SQL中对数据进行排序的过程,但这比其本地语言对应的要复杂得多。

在SQL中使用数据的方法没有“巧妙的方法” - WHERE的{​​{1}}子句只是说“如果这些条件匹配,则包括行”;它不是(也不是)订购标准。