是否可以保持'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中有一个属性,我可以使用条件子句指定保持子句的顺序。
答案 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/," ");
重要的是,因为我可以在我的场景中,我将结果缓存到下次相关项目更新时,以便查询仅在项目创建/修改时运行,而不是在每个项目查看时运行,有助于最小化任何项目表现很受欢迎。