使用 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 连续编号,则演示的方法可以正常工作。
基本上,我有与 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 连续编号,则演示的方法可以正常工作。