2012-03-30 12 views
1

Есть ли способ заказать порядок значений в предложении IN()? У меня есть запрос на выборку:Нужно получить результаты, отсортированные в том же порядке, что и значения внутри поля in() в Oracle

Select * from abc where xyz in (a list of values). 

Я хочу, чтобы результат будет отсортирован в том же порядке, что и список внутри кронштейна.

Одним из способов является то, что я могу поместить значения в таблицу temp с возрастающей последовательностью, а затем присоединиться к двум таблицам, а затем упорядочить по последовательности, но это не очень хорошо.

Есть ли способ сделать это?

ответ

0

Спасибо за ответы на все вопросы. Существует другой подход, подобный подход a_horse_with_no_name в:

with t as 
(select t.*, rownum r from table (sys.odcinumberlist(val1, val2, val3...)) t) 
select * from abc ac, t where ac.id = column_value and is_active = 'Y' order by r 

Это должно работать тоже. Какой из них, по-вашему, самый лучший и оптимальный способ сделать это?

1

Нет необходимости в временную таблицу (но на самом деле не очень либо)

with list_values (seqnr, id) as (
    select 1, 42 from dual 
    union all 
    select 2, 43 from dual 
    union all 
    select 3, 44 from dual 
    -- you get the picture 
) 
select * 
from abc 
    join list_values lv on abc.xyz = lv.id 
order by lv.seqnr 
+0

Ваше «не очень красивое», мое «уродливое» ... Чувство шаблона здесь;) – Anonymous

+0

@ Анонимно: декодированное решение также является «приятной» идеей. Не думал об этом –

1

Один уродливый вариант заключается в использовании Расшифруйте:

Select * from abc 
WHERE xyz in (a list of values) 
ORDER BY DECODE(xyz, 'val1', 1, 'val2', 2, ...) 
+0

взломал, но работает по мере необходимости. +1 – Sathya

Смежные вопросы