我有样本表和查询,其中包含此处描述的问题,
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
答案 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
这项技术的特别之处在于,如果您检查查询执行计划,则没有排序运算符。