保持"IN"条款的顺序

bAN*_*bAN 19 sql oracle

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

我在SO上发现了这个问题,但在他的例子中,OP已经有了一个排序的"IN"子句.

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

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField IN (45,2,445,12,789)
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*dge 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
Run Code Online (Sandbox Code Playgroud)

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

SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField = 4
union all
SELECT SomeField,OtherField
FROM TestResult 
WHERE TestResult.SomeField = 2
union all
...
Run Code Online (Sandbox Code Playgroud)

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

  • 正如您所说,除非您提供"ORDER BY"子句,否则没有已定义的顺序.对于一系列`UNION ALL`分离`SELECT`s和其他地方的情况一样. (2认同)

Per*_*ero 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)
Run Code Online (Sandbox Code Playgroud)

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