SELECT * FROM Table1 WHERE Col1 IN(4,2,6)
我要选择并返回与指定的顺序记录,我表示IN子句 (标有Col1中第一个显示的记录中选择记录= 4中,col1 = 2,...)
我可以使用
SELECT * FROM Table1 WHERE Col1 = 4
UNION ALL
SELECT * FROM Table1 WHERE Col1 = 6 , .....
,但我不希望使用,因为我想用它作为生成一个存储过程,而不是汽车。
SELECT * FROM Table1 WHERE Col1 IN(4,2,6)
我要选择并返回与指定的顺序记录,我表示IN子句 (标有Col1中第一个显示的记录中选择记录= 4中,col1 = 2,...)
我可以使用
SELECT * FROM Table1 WHERE Col1 = 4
UNION ALL
SELECT * FROM Table1 WHERE Col1 = 6 , .....
,但我不希望使用,因为我想用它作为生成一个存储过程,而不是汽车。
你有几个选项。最简单的方法可能是将IN参数(它们是参数,正确的)按照您接收它们的顺序放在单独的表中,然后将ORDER BY放到该表中。
此外,我只是跑过这,这可能是很好的背景信息:http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause – Tobiasopdenbrouw 2010-07-22 14:01:02
是的,这很好。有一种方法只为我工作,即将主表与主表连接在一起,但INNER JOIN的开销如何导致我的主表拥有数百万条记录!有没有最快的方法 – Ehsan 2010-07-23 21:02:03
解决的办法是沿着这条线:
SELECT * FROM Table1
WHERE Col1 IN(4,2,6)
ORDER BY
CASE Col1
WHEN 4 THEN 1
WHEN 2 THEN 2
WHEN 6 THEN 3
END
@Ehsan - 只要IN子句中的值不会改变,这样就可以正常工作。如果发生变化,您可以在SP中动态构建CASE。 – Tobiasopdenbrouw 2010-07-22 07:37:23
select top 0 0 'in', 0 'order' into #i
insert into #i values(4,1)
insert into #i values(2,2)
insert into #i values(6,3)
select t.* from Table1 t inner join #i i on t.[in]=t.[col1] order by i.[order]
与表替换IN
值,包括排序顺序在查询中使用的列(并确保揭露排序顺序调用应用程序):
WITH OtherTable (Col1, sort_seq)
AS
(
SELECT Col1, sort_seq
FROM (
VALUES (4, 1),
(2, 2),
(6, 3)
) AS OtherTable (Col1, sort_seq)
)
SELECT T1.Col1, O1.sort_seq
FROM Table1 AS T1
INNER JOIN OtherTable AS O1
ON T1.Col1 = O1.Col1
ORDER
BY sort_seq;
在你存储过程,而不是CTE,将值分解到适当填充排序列的表中(一个暂存基表,临时表,返回一个表的函数等)。
我在考虑这个问题有两种不同的方式,因为我不能确定这是一个编程问题还是数据结构问题。查看下面包含“着名”电视动物的代码。假设我们正在追踪海豚,马,熊,狗和红毛猩猩。我们希望在我们的查询中只返回马匹,熊和狗,并且我们希望熊在马之前排序,以便在狗之前排序。我个人偏好把这看作是一个架构问题,但是可以把我的头看成编程问题。如果您有任何问题,请告诉我。
CREATE TABLE #AnimalType (
AnimalTypeId INT NOT NULL PRIMARY KEY
, AnimalType VARCHAR(50) NOT NULL
, SortOrder INT NOT NULL)
INSERT INTO #AnimalType VALUES (1,'Dolphin',5)
INSERT INTO #AnimalType VALUES (2,'Horse',2)
INSERT INTO #AnimalType VALUES (3,'Bear',1)
INSERT INTO #AnimalType VALUES (4,'Dog',4)
INSERT INTO #AnimalType VALUES (5,'Orangutan',3)
CREATE TABLE #Actor (
ActorId INT NOT NULL PRIMARY KEY
, ActorName VARCHAR(50) NOT NULL
, AnimalTypeId INT NOT NULL)
INSERT INTO #Actor VALUES (1,'Benji',4)
INSERT INTO #Actor VALUES (2,'Lassie',4)
INSERT INTO #Actor VALUES (3,'Rin Tin Tin',4)
INSERT INTO #Actor VALUES (4,'Gentle Ben',3)
INSERT INTO #Actor VALUES (5,'Trigger',2)
INSERT INTO #Actor VALUES (6,'Flipper',1)
INSERT INTO #Actor VALUES (7,'CJ',5)
INSERT INTO #Actor VALUES (8,'Mr. Ed',2)
INSERT INTO #Actor VALUES (9,'Tiger',4)
/* If you believe this is a programming problem then this code works */
SELECT *
FROM #Actor a
WHERE a.AnimalTypeId IN (2,3,4)
ORDER BY case when a.AnimalTypeId = 3 then 1
when a.AnimalTypeId = 2 then 2
when a.AnimalTypeId = 4 then 3 end
/* If you believe that this is a data architecture problem then this code works */
SELECT *
FROM #Actor a
JOIN #AnimalType at ON a.AnimalTypeId = at.AnimalTypeId
WHERE a.AnimalTypeId IN (2,3,4)
ORDER BY at.SortOrder
DROP TABLE #Actor
DROP TABLE #AnimalType
我知道这是一个有点晚,但最好的办法是
SELECT *
FROM Table1
WHERE Col1 IN(4, 2, 6)
ORDER BY CHARINDEX(CAST(Col1 AS VARCHAR), '4,2,67')
或者
SELECT CHARINDEX(CAST(Col1 AS VARCHAR), '4,2,67')s_order,
*
FROM Table1
WHERE Col1 IN(4, 2, 6)
ORDER BY s_order
不错的一个。工作过一种享受! – Adam 2013-10-16 02:07:58
如果ID子字符串出现在干草堆多个地方会发生什么?例如在'4,44,404'中找到id 4的索引 – 2016-07-20 02:31:58
我已经找到另一种解决方案。这与当时的答案类似,但稍微短一些。
SELECT sort.n, Table1.Col1
FROM (VALUES (4), (2), (6)) AS sort(n)
JOIN Table1
ON Table1.Col1 = sort.n
你打算对'IN'子句的值进行parmaterising吗? 总会有三个吗? – 2010-07-22 07:34:45