我对ids={1000,50,300,40}
等ID进行了一些查询
我想从db表中选择一些具有该ID的项目,并且我希望将项目序列保存到id的序列中。
我的意思是,我使用选择陈述:
SELECT *
FROM items
WHERE id IN (1000,50,300,40)
我希望得到结果
id name
-------------
1000 item1
50 item2
300 item3
40 item4
但是SQL将结果返回为
id name
-------------
40 item4
50 item2
300 item3
1000 item1
保存ID的顺序非常重要。有人能帮助我吗?
答案 0 :(得分:5)
假设SQL Server 2000+,请使用CASE表达式:
SELECT i.*
FROM ITEMS i
WHERE i.id IN (1000,50,300,40)
ORDER BY CASE i.id
WHEN 1000 THEN 1
WHEN 50 THEN 2
WHEN 300 THEN 3
WHEN 40 THEN 4
ELSE 5
END
答案 1 :(得分:4)
您还遇到了如何参数化in
子句的问题。如果您使用的是SQL Server 2008,则可以使用表值参数。您可以使用包含order by
列和value
列的2列TVP,然后加入其中。
对于以前的版本,您可以使用split
表值函数返回2列(index
和value
)并加入其中。
SELECT i.*
FROM dbo.split('1000,50,300,40') s
JOIN items i ON i.id = s.value
ORDER BY s.idx
此类函数is here的示例。我并不赞同这个特定的实现,因为有probably far better ones但你可以用它来看一般方法。
答案 2 :(得分:1)
我唯一能想到的是开发或发现一些其他列将以正确的顺序返回对象,或UNION一系列查询按个人ID,这将导致每个查询结果按顺序附加到所有以前的结果集。
发生这种情况的原因是SQL引擎正在执行索引或表扫描以查找记录,并且由于记录通常按其ID的顺序存储,这是它将找到它们的默认顺序并将它们添加到结果集。
答案 3 :(得分:-2)
使用
select * from items WHERE id IN (1000,50,300,40) order by id desc
答案 4 :(得分:-4)
将ORDER BY子句分别添加到具有ASC或DESC的查询中,以升序或降序。
select * from items where id in (1000,50,300,40) order by id