本质上,我有同样的问题,例如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。
最好的方法是什么?
答案 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连续编号,则演示方法可以很好地工作。