使用 SELECT...IN (),我怎样才能对结果进行排序以匹配 IN (...) 列表中的顺序?

Using SELECT...IN (), how can I order the results to match the order in IN (...) list?

基本上,我有与 this guy 相同的问题,但还是 Oracle 数据库。

考虑 select:

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.

最好的方法是什么?

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

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

但是您可以使用 xmltable 或集合来指定顺序。

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 returns 元素的顺序与它们在构造函数中指定的顺序相同。

所以你依赖集合迭代器的行为。

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