使用SELECT ... IN(),如何排序结果以使其与IN(...)列表中的顺序匹配?

时间:2018-12-14 13:15:52

标签: oracle sql-order-by where-in

本质上,我有同样的问题,例如this guy,或者是Oracle数据库。

考虑选择:

SELECT
USERS.USER AS USER,
USERS.ID AS ID
FROM
USERS
WHERE USERS.ID IN (1,3,2)

我希望结果按在IN (1,3,2)中的出现顺序进行排序。这应该是输出:

USER | ID
-----+----
 Foo | 1
 Bar | 3
 Baz | 2

请注意顺序为1, 3 ,2,而不是1,2,3。

最好的方法是什么?

2 个答案:

答案 0 :(得分:2)

              their sort order
                       v     v     v
order by decode(id, 1, 1, 3, 2, 2, 3)
                    ^     ^     ^
              elements in IN list

答案 1 :(得分:1)

顺序不适用于列表中的元素。

但是,您可以使用xmltable或collection来指定顺序。

with users(id, usr) as
(
select 1, 'Foo' from dual
union all select 2, 'Bar' from dual
union all select 3, 'Baz' from dual
)
select *
from users
join xmltable('1,3,2' columns id for ordinality, o int path'.' ) using (id)
order by o;

with users(id, usr) as
(
select 1, 'Foo' from dual
union all select 2, 'Bar' from dual
union all select 3, 'Baz' from dual
)
select *
from users
join (select rownum id, value(t) o from table(sys.odcinumberlist(1,3,2)) t) using (id)
order by o;

Collection iterator以与构造函数中指定的顺序相同的顺序返回元素。

因此,您依赖集合迭代器的行为。

请注意,如果源行从1到n连续编号,则演示方法可以很好地工作。