2009-05-18 4 views
2

Ich bin auf der Suche nach der besten Möglichkeit, Zahlen direkt aus einem In-Klausel auszuwählen.Oracle Wählen Sie Zahlen aus einer IN-Klausel

Grundsätzlich mag:

 
SELECT * FROM (2,6,1,8); 

Das funktioniert nicht. Ich kann es so machen:

 
SELECT Lv FROM ( SELECT Level LV 
        FROM DUAL 
        CONNECT BY Level < 20) 
WHERE Lv IN (2,6,1,8); 

Aber das scheint ein bisschen klobig zu sein. Gibt es einen eleganteren Weg?

+0

Gibt es ein besonderes Problem, das Sie, indem Sie diese zu lösen sind versuchen? – mmorrisson

+0

Es ist wirklich einmalige pl/sql Ausführungen. Erzeugen von Schleifen über bestimmte Zahlen und dergleichen. –

Antwort

1

Es ist eleganter, wenn Sie eine Hilfsnummern Tabelle materialisieren:

SELECT num FROM numbers WHERE num IN (2,6,1,8); 

Und das ist auch nützlich, wenn sie mit einer anderen Tabelle zusammengefasst.

Zum Beispiel habe ich einen Fall, wo ich große Konfigurationstabellen mit Änderungen von stückweise Ergebnissen bevölkert benötigt:

Big SP oder Excel-Sheet oder melden Sie fehlende Kostenstellen in Config identifiziert gibt einen großen Satz von Ergebnissen die in einigen Gruppen mit unterschiedlichen Daten eingefügt werden müssen.

Paste Teilergebnisse in ein einzelnes Komma getrennt Listen:

INSERT INTO {stuff} 
SELECT {stuff}, 130 as line_item 
FROM numbers 
WHERE numbers.num IN ({pasted a section of results}) 

INSERT INTO {stuff} 
SELECT {stuff}, 135 as line_item 
FROM numbers 
WHERE numbers.num IN ({pasted another section of results}) 
+0

Großartige Idee. Ich habe RowNum vorher mit ALL_OBJECTS benutzt, aber es fühlt sich einfach nicht richtig an. –

+0

Wozu dient die Nummerntabelle? Könnte man nicht einfach "FROM {big construct} WHERE cost_center in ({Auswahl der Ergebnisse})" schreiben? – Andomar

+0

Entschuldigung, das war ein schlechtes Beispiel. Ich werde es korrigieren. –

0

Wenn Sie nicht explizit die Klausel IN benötigen, könnten Sie UNION verwenden:

select 2 from dual 
    union 
    select 6 from dual 
    union 
    select 1 from dual 
    union 
    select 8 from dual 

Es gibt eine elegantere Variante mehrere Zeilen in eine Tabelle einfügen:

INSERT ALL 
    INTO table (col) VALUES ('a') 
    INTO table (col) VALUES ('b') 
    INTO table (col) VALUES ('c') 
SELECT * FROM dual; 

Aber ich Ich kenne keine Möglichkeit, das für einen SELECT zu tun.

3

Sie

tun können
select column_value from table(sys.dbms_debug_vc2coll(1,2,3,4,5)); 

aber das gibt tatsächlich eine varchar2. Sie können Ihre eigene Art und verwenden, die

create type tab_num is table of number; 
/
select column_value from table(tab_num(1,2,3,4,5)); 

Es ist auch einen Blick wert der MODEL-Klausel erstellen. Es sieht kompliziert aus, aber es ist sehr gut Erzeugen von Daten

SELECT x from dual 
MODEL DIMENSION BY (1 AS z) MEASURES (1 x) 
    RULES ITERATE (7) (x[ITERATION_NUMBER]=ITERATION_NUMBER+1) 
Verwandte Themen