2013-03-01 56 views
4
SELECT * FROM tblItems 
WHERE itemId IN (9,1,4) 

返回的顺序是SQL发现它们(恰好是1,4,9)但是,我希望它们按以下顺序返回:我在数组中指定。如何使用IN命令保留SQL查询的顺序

我知道我可以用我的母语(obj c)对它们重新排序,但是在SQL中有这样一个简单的方法吗?

财产以后这样将是巨大的:

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

http://stackoverflow.com/questions/866465/sql-order-by-the-在价值列表 – Atomsk 2013-03-01 10:56:29

回答

1

您可以添加的情况下构建你的SELECT子句。

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

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

有没有“整洁的方式”来解决像SQL那样的数据 - SELECTWHERE子句只是说“如果这些标准匹配,包含行”;它不是(也不是)订购标准。

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

我在MySQL环境曾经有过相同的任务。

我结束了使用

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

从那时起,这是为我工作。我希望它也适用于SQLite的

+1

这在SQLite中不起作用。 – 2013-03-01 11:00:07

2

使用CASE expression的ID值映射到一个递增的序列:

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

谢谢 - 这似乎工作!这是否会影响效率? – Robert 2013-03-01 11:25:30

+0

在执行速度变得明显之前,您会让SQLite抱怨太长的命令。无论如何,'... IN(...)'会有同样的问题。如果您的ID列表太长而不能在命令字符串中包含逐字,则必须用dan1111的解决方案替换IN和ORDER BY。 – 2013-03-01 12:56:38