2011-03-01 138 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