如何使用IN命令保留SQL查询的顺序
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 :)
您可以添加的情况下构建你的SELECT子句。
select case when itemid = 9 then 1
when itemid = 1 then 2 else 3 end sortfield
etc
order by sortfield
您可以创建一个过程来在SQL中对数据进行排序,但这会比其母语对应的复杂得多。
有没有“整洁的方式”来解决像SQL那样的数据 - SELECT
的WHERE
子句只是说“如果这些标准匹配,包含行”;它不是(也不是)订购标准。
可能最好的办法是创建一个项目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
我在MySQL环境曾经有过相同的任务。
我结束了使用
ORDER BY FIND_IN_SET(itemID, '9,1,4')
从那时起,这是为我工作。我希望它也适用于SQLite的
这在SQLite中不起作用。 – 2013-03-01 11:00:07
使用CASE expression的ID值映射到一个递增的序列:
... ORDER BY CASE itemId
WHEN 9 THEN 1
WHEN 1 THEN 2
ELSE 3
END
谢谢 - 这似乎工作!这是否会影响效率? – Robert 2013-03-01 11:25:30
在执行速度变得明显之前,您会让SQLite抱怨太长的命令。无论如何,'... IN(...)'会有同样的问题。如果您的ID列表太长而不能在命令字符串中包含逐字,则必须用dan1111的解决方案替换IN和ORDER BY。 – 2013-03-01 12:56:38
http://stackoverflow.com/questions/866465/sql-order-by-the-在价值列表 – Atomsk 2013-03-01 10:56:29