保持“IN”条款的顺序

时间:2013-01-03 13:32:04

标签: sql oracle

是否可以保持'IN'条件条款的顺序?

我在SO上找到了this question,但在他的例子中,OP已经有了一个排序的“IN”子句。

我的情况不同,'IN'子句是随机顺序 像这样:

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField IN (45,2,445,12,789)

我想以(45,2,445,12,789)的顺序检索结果。我正在使用Oracle数据库。也许SQL中有一个属性,我可以使用条件子句指定保持子句的顺序。

5 个答案:

答案 0 :(得分:19)

除非您使用ORDER BY子句,否则将没有可靠的排序。

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField IN (45,2,445,12,789)
order by case TestResult.SomeField
         when 45 then 1
         when 2  then 2
         when 445 then 3
         ...
         end

您可以将查询拆分为5个查询联合,尽管...

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField = 4
union all
SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField = 2
union all
...

我更信任前一种方法,它可能会表现得更好。

答案 1 :(得分:3)

试试这个:

SELECT T.SomeField,T.OtherField
FROM TestResult T
 JOIN 
   (
     SELECT 1 as Id, 45 as Val FROM dual UNION ALL
     SELECT 2, 2 FROM dual UNION ALL
     SELECT 3, 445 FROM dual UNION ALL
     SELECT 4, 12 FROM dual UNION ALL
     SELECT 5, 789  FROM dual
   ) I
   ON T.SomeField = I.Val
ORDER BY I.Id

答案 2 :(得分:3)

在这种情况下,

解码功能代替了 case表达式

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField IN (45,2,445,12,789)
ORDER BY DECODE(SomeField, 45,1, 2,2, 445,3, 12,4, 789,5)

请注意,出于可读性原因,值,位置对(例如 445,3 )会保持在一起。

答案 3 :(得分:2)

有一种使用字符串函数的替代方法:

with const as (select ',45,2,445,12,789,' as vals)
select tr.*
from TestResult tr cross join const
where instr(const.vals, ','||cast(tr.somefield as varchar(255))||',') > 0
order by instr(const.vals, ','||cast(tr.somefield as varchar(255))||',')

我提供这个是因为您可能会发现维护一串值而不是中间表更容易。

答案 4 :(得分:0)

我能够在我的应用程序中使用(使用SQL Server 2016)

select ItemID, iName
  from Items
      where ItemID in (13,11,12,1)
      order by CHARINDEX(' ' + Convert("varchar",ItemID) + ' ',' 13 , 11 , 12 , 1 ')

我使用代码端正则表达式用空格替换\b(字边界)。有点像...

var mylist = "13,11,12,1";
var spacedlist = replace(mylist,/\b/," ");

重要的是,因为我可以在我的场景中,我将结果缓存到下次相关项目更新时,以便查询仅在项目创建/修改时运行,而不是在每个项目查看时运行,有助于最小化任何项目表现很受欢迎。