2016-11-22 18 views
1

我有樣表和查詢與這裏所描述的問題,SQL ORDER BY CSV輸入參數

CREATE TABLE test 
(
    ID INT IDENTITY(1, 1), 
    NAME VARCHAR(250), 
    VALUE float 
) 

INSERT INTO test(NAME,[VALUE])VALUES('A',100) 
INSERT INTO test(NAME,[VALUE])VALUES('B',200) 
INSERT INTO test(NAME,[VALUE])VALUES('C',200) 

SELECT * FROM test WHERE ID IN (2,1,3) 

ID   NAME  VALUE 
----------- --------- ---------------- 
1   A   100 
2   B   200 
3   C   200 

QUERY:當我通過在WHERE子句也應該給結果(2,1,3)相同的順序如下:

ID   NAME  VALUE 
----------- --------- ---------------- 
2   B   200 
1   A   100 
3   C   200 
+1

請用你正在使用的數據庫標記你的問題。 –

+0

它不會。它檢查每行是否屬於在'IN'子句中定義的集合,但它會產生結果集,因爲它會得到行 – Alfabravo

+0

你的問題是數據庫依賴,所以請告訴我們你正在使用哪個數據庫 – scaisEdge

回答

1

如果你抓住的DelimitedSplit8K副本,你可以這樣做:

-- assuming these values come in as a parameter: 
DECLARE @searchString varchar(100) = '2,1,3'; 

-- solution using delimitedSplit8K 
SELECT t.ID, t.Name, t.VALUE 
FROM dbo.test t 
JOIN dbo.delimitedSplit8K(@searchString,',') s ON s.item = t.id 
ORDER BY s.itemNumber; 

結果:

ID   Name VALUE 
----------- ----- ------ 
2   B  200 
1   A  100 
3   C  200 

是什麼讓這個技術尤其奇妙的是,如果您檢查查詢執行計劃,則不存在排序運算符。

2

我不知道你爲什麼會想到結果是在in列表的順序。 SQL與無序集合;所以沒有內在排序 - 除非明確使用order by子句。

它看起來像你正在使用SQL Server。你可以做你想要什麼join

SELECT t.* 
FROM test t JOIN 
    (VALUES (2, 1), (1, 2), (3, 3) 
    ) v(id, ordering) 
    ON t.id = v.id 
ORDER BY ordering;