按ID选择时如何保存项目的顺序?

时间:2011-03-01 16:46:24

标签: sql sql-server sql-server-2005 tsql

我对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的顺序非常重要。有人能帮助我吗?

5 个答案:

答案 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列(indexvalue)并加入其中。

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