2010-07-22 96 views
2

与IN子句的顺序

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 , ..... 

,但我不希望使用,因为我想用它作为生成一个存储过程,而不是汽车。

+0

你打算对'IN'子句的值进行parmaterising吗? 总会有三个吗? – 2010-07-22 07:34:45

回答

5

你有几个选项。最简单的方法可能是将IN参数(它们是参数,正确的)按照您接收它们的顺序放在单独的表中,然后将ORDER BY放到该表中。

+0

此外,我只是跑过这,这可能是很好的背景信息:http://stackoverflow.com/questions/337704/parameterizing-a-sql-in-clause – Tobiasopdenbrouw 2010-07-22 14:01:02

+0

是的,这很好。有一种方法只为我工作,即将主表与主表连接在一起,但INNER JOIN的开销如何导致我的主表拥有数百万条记录!有没有最快的方法 – Ehsan 2010-07-23 21:02:03

4

解决的办法是沿着这条线:

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 
+0

@Ehsan - 只要IN子句中的值不会改变,这样就可以正常工作。如果发生变化,您可以在SP中动态构建CASE。 – Tobiasopdenbrouw 2010-07-22 07:37:23

1
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] 
1

与表替换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,将值分解到适当填充排序列的表中(一个暂存基表,临时表,返回一个表的函数等)。

0

我在考虑这个问题有两种不同的方式,因为我不能确定这是一个编程问题还是数据结构问题。查看下面包含“着名”电视动物的代码。假设我们正在追踪海豚,马,熊,狗和红毛猩猩。我们希望在我们的查询中只返回马匹,熊和狗,并且我们希望熊在马之前排序,以便在狗之前排序。我个人偏好把这看作是一个架构问题,但是可以把我的头看成编程问题。如果您有任何问题,请告诉我。

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 
11

我知道这是一个有点晚,但最好的办法是

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 
+0

不错的一个。工作过一种享受! – Adam 2013-10-16 02:07:58

+1

如果ID子字符串出现在干草堆多个地方会发生什么?例如在'4,44,404'中找到id 4的索引 – 2016-07-20 02:31:58

0

我已经找到另一种解决方案。这与当时的答案类似,但稍微短一些。

SELECT sort.n, Table1.Col1 
FROM (VALUES (4), (2), (6)) AS sort(n) 
JOIN Table1 
ON Table1.Col1 = sort.n