2011-03-01 139 views
1

我有ID如ids={1000,50,300,40} 我whant选择一些项目进行从数据库表中ID的一些查询,我要保存项目的顺序accordind到IDS的序列。 我的意思是,我使用select statment:如何在通过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 

它保存是非常重要的ids的顺序。有谁能够帮助我?

+0

说实话,我严重质疑不知道任何进一步的细节此要求的重要性。保留所请求的ID的顺序可能只是更普遍的设计问题的症状。只是我的两分钱... – 2011-03-01 16:58:05

+0

什么版本的SQL Server? – 2011-03-01 17:07:26

+0

的MS SQL Server 2005 – Kate 2011-03-02 13:43:05

回答

1

我能想到的唯一的事情就是开发或发现一些列将在正确的顺序,或联盟追加一系列由单个ID查询,这将导致每个查询结果返回的对象,在秩序,所有以前的结果集。

发生这种情况的原因是SQL引擎正在执行索引或表扫描以查找记录,并且由于记录通常按其ID的顺序存储,所以这是默认顺序,它会查找它们并将它们添加到结果集。

+0

是的,这是我想要的东西,但我不知道如何一些列添加到我的结果,以及如何生成该列一些数字! – Kate 2011-03-01 17:08:42

+1

您可以在您的选择列表中尝试包括@@ RowNum或@@ Identity。如果有曾经在SQL引擎完全基于IN子句为了拉动记录的阶段,它只是重新排序的结果集索引顺序,你也许能够通过保持秩序的轨道覆盖重新排序,其中结果被放入结果集中。 – KeithS 2011-03-01 17:17:47

+0

...但是,我怀疑你可以这样做。我认为最简单的方法是在一系列UNIONed语句中单独搜索记录,或者在本机代码中跟踪ID的顺序,并且在将结果写入内存对象后,将它们放入以相同的顺序收集。 – KeithS 2011-03-01 17:19:49

-4

BY子句订单添加到查询与ASC或DESC为升序或降序进行排序。

select * from items where id in (1000,50,300,40) order by id 
+1

完全不是他之后的事......请在回答之前阅读。 – JNK 2011-03-01 16:52:29

+0

这不会按照请求在where子句中产生id的顺序,而是正是OP所要求的id的自然顺序。 – 2011-03-01 16:54:08

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 
+0

+1 <额头拍>比我的好多了。 – 2011-03-01 16:54:49

+0

事实上,我有超过4个ID在“进”的陈述,我不知道IDS的先验值。 – Kate 2011-03-01 17:05:49

+1

@Kate:对不起,SQL是声明式的 - 没有可用的动态/隐式/自然排序。动态ORDER BY需要动态SQL ... – 2011-03-01 17:09:49

4

你也有一个如何进行参数的in条款的问题。如果你在SQL Server 2008上,你可以使用表值参数。你可以使用一个2列TVP既与order by列和value列,然后加入到这一点。

对于以前的版本,您可以使用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

我相信你的意思是'ORDER BY s.index'。 – 2011-03-02 12:59:18

+0

@Andriy - 是的。谢谢你让我知道。 – 2011-03-02 13:02:43

-2

使用

select * from items WHERE id IN (1000,50,300,40) order by id desc 
+0

这就是OP不想要的相反顺序。他想要的订单是1000,50,300,40,而不是1000,300,50,40。 – 2011-03-02 03:38:14