2015-10-05 64 views
0

我有一个select语句,我在where子句中使用。是否可以根据子句的顺序选择记录?

这里是我的表:MyTable的

Id  SKU 
1  112 
2  223 
3  445 
4  456 
5  678 

如果我写:

SELECT Id 
FROM MyTable 
WHERE SKU IN (112,223,445, 456, 678) 

我一个没有得到结果作为

1 
2 
3 
4 
5 

有没有得到选择结果基于任何方式对于in条款中的物品订单。?

+0

“如果我写:...我没有得到结果......”,但如果您的“这是我的表:MyTable”语句是真的,您应该。你的问题显然缺乏澄清你真正拥有的东西以及你真正想要的东西。 – pkuderov

+1

总之:没有。如果“IN”列表中的值是从另一个数据源中选择的,例如表格或视图,并且可以从中获得合适的排名,您可以单独应用,例如通过合适的'JOIN'和'ORDER BY'。 – HABO

+0

感谢所有的答案。 – user123456

回答

-1

对于你的情况ORDER BY id就足够了。

SELECT Id 
FROM MyTable 
WHERE SKU IN (112,223,445, 456, 678) 
ORDER BY id 

对于您可以使用JOIN与派生表像一般的方法:

Demo

SELECT m.Id 
FROM MyTable m 
JOIN (VALUES (1, 112) ,(2,223) ,(3,445), (4,456), (5,678)) AS t(num, SKU) 
    ON m.SKU = t.SKU 
ORDER BY t.num 

如果使用SQL Server 2008中您可以使用UNION ALL

Demo2

;WITH cte AS 
(
    SELECT 112 AS SKU, 1 AS orderNum 
    UNION ALL 
    SELECT 223 AS SKU, 2 AS orderNum 
    UNION ALL 
    SELECT 445 AS SKU, 3 AS orderNum 
    UNION ALL 
    SELECT 456 AS SKU, 4 AS orderNum 
    UNION ALL 
    SELECT 678 AS SKU, 5 AS orderNum 
) 
SELECT m.Id 
FROM #MyTable m 
JOIN cte c 
    ON m.SKU = c.SKU 
ORDER BY c.orderNum; 

一般的做法是不强迫你创建自定义查询,您可以使用临时表与IDENTITY列,如:

Demo3

CREATE TABLE #mySKU(orderNum INT IDENTITY(1,1), SKU INT); 

INSERT INTO #mySKU 
VALUES (112),(223),(445), (456), (678); 

SELECT m.Id 
FROM #MyTable m 
JOIN #mySKU c 
    ON m.SKU = c.SKU 
ORDER BY c.orderNum; 
+0

如果skus值是动态的,该怎么办?我们如何使用一般方法? – user123456

+0

@ user123456如果SKU是动态的,而不是IN('a','b','c'),则需要生成值为JOIN的值对,如'((1,'a'),(2,'b')) ,(3,'c'))' – lad2025

+0

**对于downvoters,我会很高兴知道提出的解决方案有什么问题** – lad2025

-1

“有没有什么办法让根据条款中的项目顺序选择结果?“

对于这个特定的问题,答案是

相关问题