25

是否可以保持“IN”条件子句的顺序?

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

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

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

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

4

5 回答 5

22

除非您使用 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
...

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

于 2013-01-03T13:35:56.650 回答
6

在这种情况下,解码函数很方便,而不是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)保持在一起。

于 2018-07-10T10:42:16.497 回答
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
于 2013-01-03T13:37:04.283 回答
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))||',')

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

于 2013-01-03T14:20:11.823 回答
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/," ");

重要的是,因为我可以在我的场景中缓存结果,直到下次更新相关项目时,查询才在项目创建/修改时运行,而不是在每次查看项目时运行,这有助于最大限度地减少任何性能损失。

于 2018-01-21T03:39:21.737 回答