IN
并不意味着最终结果的任何排序:
这个 SQL:
... WHERE x IN (1, 2, 3)
应该产生与此相同的结果:
... WHERE x IN (3, 2, 1)
该IN
子句基本上只过滤行,对于每一行,您可以将其视为只是询问“该行是否应该是结果集的一部分?”。
要获得特定的顺序,您必须在ORDER BY
语句中添加一个子句。
要获得特定订单,您可以使用内联表:
SELECT Barcode
FROM BarcodeTable
inner join (values
('*53-3-1*', 1),
('*51-1-1*', 2),
('*51-2-1*', 3),
('*50-10-1*', 4),
('*50-8-1*', 5),
('*51-4-1*', 6),
('*50-1-1*', 7)) as DummyTable (value, sortorder)
on BarCode = value
order by
sortorder
这将按 DummyTable 的 sortorder 字段进行排序。
您不能欺骗 SQL Server 使用IN
子句本身进行排序,您必须ORDER BY
以某种形式添加一个。
您还可以使用CASE WHEN ...
表达式根据条形码生成排序顺序值:
SELECT Barcode
FROM BarcodeTable
WHERE BarCode IN ('*53-3-1*', '*51-1-1*', '*51-2-1*', '*50-10-1*', '*50-8-1*', '*51-4-1*', '*50-1-1*')
ORDER BY
CASE BarCode
WHEN '*53-3-1*' THEN 1
WHEN '*51-1-1*' THEN 2
WHEN '*51-2-1*' THEN 3
WHEN '*50-10-1*' THEN 4
WHEN '*50-8-1*' THEN 5
WHEN '*51-4-1*' THEN 6
WHEN '*50-1-1*' THEN 7
END
正如 Lieven 的评论所暗示的,在 SQL Server 2005 上有一个替代方案,使用该WITH
子句:
WITH DummyTable (value, sortorder) AS (
SELECT '*53-3-1*' AS value, 1 AS sortorder
UNION ALL
SELECT '*51-1-1*', 2
UNION ALL
SELECT '*51-2-1*', 3
UNION ALL
SELECT '*50-10-1*', 4
UNION ALL
SELECT '*50-8-1*', 5
UNION ALL
SELECT '*51-4-1*', 6
UNION ALL
SELECT '*50-1-1*', 7
)
SELECT Barcode
FROM BarcodeTable
inner join DummyTable
on BarCode = value
order by
sortorder
(注意,我不是使用的专家WITH
,以上只是我一起破解的东西,但似乎有效)