2013-02-25 170 views
0

我運行一個相當長的SQL查詢,其核心是非常基本的:SQL排序CHARINDEX()

SELECT * FROM documents WHERE doc_id IN (995,941,940,954,953,973) 

這個查詢我的目標結果以隨後顯示的順序文件中,他們在IN子句中設置。但是,我還沒有找到一個乾淨的解決方案。

我想我可以使用charindex()來處理這個。

ORDER BY charindex('995,941,940,954,953,973',doc_id) 

該ORDER BY的結果只是以默認的ASC順序命令doc_ids。

關於如何明確定義結果的任何指導可以爲此查詢命令?

+0

有幾種想法,也許有人可能想要編寫代碼,但這是一個痛苦。無論如何,您可以使用臨時表爲您的IN子句中的值創建一個順序,並使用http://social.msdn.microsoft.com/forums/en-US/transactsql/thread將它們解析到臨時表中/ 4126a010-6885-4eb0-b79c-c798c90edb85。另一種方法是使用遊標並逐行返回。臨時表可能更快。 – RandomUs1r 2013-02-25 17:09:40

回答

4

你CHARINDEX是倒退:

order by charindex(doc_id, '995,941,940,954,953,973') 

如果doc_id存儲爲一個數字,然後你需要做的鑄造:

order by chardindex(cast(doc_id as varchar(255)), '995,941,940,954,953,973') 

而且,你可能會考慮把文檔IDS中一個列表。然後他們可以在整個查詢中使用:

with doclist as (
     select 1 as ordering, '995' as docid union all 
     select 2 , '941' union all 
     . . . 
) 
select . . . 
from . . . 
    left outer join 
    doclist dl 
    on docid = dl.docid 
order by dl.ordering 
+0

這讓我需要去的地方。非常感謝您的幫助。 – Yuschick 2013-02-25 17:23:22

+0

啊,是的,CTE>新版本的SQL中的臨時表。 – RandomUs1r 2013-02-25 22:05:31