SQL ORDER BY CSV输入参数

时间:2016-11-22 15:44:34

标签: sql sql-server tsql sql-server-2014

我有样本表和查询,其中包含此处描述的问题,

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)时,它应该给出与下面相同的ORDER结果:

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

这项技术的特别之处在于,如果您检查查询执行计划,则没有排序运算符。