2012-03-30 5 views
1

Gibt es eine Möglichkeit, nach der Reihenfolge der Werte in einer IN() -Klausel zu sortieren? Ich habe eine Auswahlabfrage:Müssen die Ergebnisse in der gleichen Reihenfolge sortiert werden wie die Werte im Feld in() von select in Oracle

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

Ich mag das Ergebnis in der gleichen Reihenfolge wie in der Liste innerhalb der Klammer sortiert werden.

Ein Weg ist, dass ich die Werte in eine temporäre Tabelle mit einer steigenden Sequenz setzen kann und dann die 2 Tabellen verbinden und dann nach der Reihenfolge sortieren, aber das ist kein guter Weg.

Gibt es eine Möglichkeit, dies zu tun?

Antwort

0

Danke für alle Antworten. Es ist ein weiterer Ansatz, ähnlich wie a_horse_with_no_name Ansatz:

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 

Dies sollte auch funktionieren. Was denkst du, ist der beste und optimale Weg dies zu tun?

1

Keine Notwendigkeit für eine temporäre Tabelle (aber nicht wirklich hübsch entweder)

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

Ihr ist "nicht wirklich hübsch", meins ist "hässlich" ... Hier ein Muster erkennen;) – Anonymous

+0

@Anonym: Die Dekodierlösung ist auch eine "nette" Idee. Dachte nicht an diese –

1

Eine hässliche Option ist DECODE zu verwenden:

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

Hack, aber funktioniert wie erforderlich. +1 – Sathya