Используя SELECT ... IN (), как я могу упорядочить результаты в соответствии с порядком в списке IN (...)? - PullRequest
0 голосов
/ 14 декабря 2018

По сути, у меня такой же вопрос, как у этого парня , но или базы данных 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 голосов
/ 14 декабря 2018

Порядок не применяется к элементам в списке.

Однако вы можете использовать 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.

0 голосов
/ 14 декабря 2018
              their sort order
                       v     v     v
order by decode(id, 1, 1, 3, 2, 2, 3)
                    ^     ^     ^
              elements in IN list
...