获取结果的顺序与select的in()字段内的值相同

时间:2012-03-30 11:43:47

标签: oracle sorting sql-order-by

是否有办法按IN()子句中的值顺序排序? 我有一个选择查询:

Select * from abc where xyz in (a list of values).

我希望结果的排序顺序与括号内的列表相同。

一种方法是我可以将值放在具有递增序列的临时表中,然后连接2个表,然后按顺序排序,但这不是一个好方法。

有办法做到这一点吗?

3 个答案:

答案 0 :(得分:1)

不需要临时表(但也不是很漂亮)

with list_values (seqnr, id) as (
    select 1, 42 from dual
    union all
    select 2, 43 from dual
    union all
    select 3, 44 from dual
    -- you get the picture
)
select *
from abc
  join list_values lv on abc.xyz = lv.id
order by lv.seqnr

答案 1 :(得分:1)

一个丑陋的选择是使用DECODE:

Select * from abc 
WHERE xyz in (a list of values) 
ORDER BY DECODE(xyz, 'val1', 1, 'val2', 2, ...) 

答案 2 :(得分:0)

感谢所有答案。 还有另一种方法,类似于a_horse_with_no_name的方法:

with t as 
(select t.*, rownum r from table (sys.odcinumberlist(val1, val2, val3...)) t)
select * from abc ac, t where ac.id = column_value and is_active = 'Y' order by r

这也应该有用。您认为哪一个是最佳和最佳的方法?