2016-09-29 4 views
1

Ich versuche, eine Oracle 12c SQL-Anweisung wie folgt zu schreiben:12c Oracle - generieren dynamisch eine where-Klausel basierend auf einem Wert in einer anderen Tabelle

select * from table1 where col1 in (*dynamicvalue*) 

ich den dynamischen Wert wollen das Ergebnis der sein folgende SQL:

select col2 from table2 where rowid = 1 

Ist das möglich? Col2 enthält eine Liste von Werten wie folgt aus: ‚val1‘, ‚wert2‘, ‚val3‘

Danke

+0

Das Ergebnis der zweiten Abfrage ist keine * Liste *. Sie sollten sich 'Joins' anschauen. Dynamische SQL ist hier nicht nötig. –

+0

Vielleicht habe ich es nicht richtig geschrieben, ein einzelner Datensatz von Col2 eine Liste von Werten wie folgt: 'val1', 'val2', 'val3' – AAA

+0

mögliche Duplikate mit [diesem Beitrag] (http://stackoverflow.com/ Fragen/39290079/oracle-verwenden-ein-string-inside-in-condition/39290316 # 39290316) – Plirkee

Antwort

2

Statt dynamic-SQL können Sie die Zeichenfolge aufgeteilt und die Abfrage durchzuführen. Um die Zeichenfolge zu teilen, verwenden Sie regexp_substr.

select * from table1 
where col1 in (select regexp_substr(col2,'[^,]+', 1, level) 
       from table2 
       connect by regexp_substr(col2, '[^,]+', 1, level) is not null) 
+0

Danke! Ich denke, das ist der richtige Weg. Gibt es eine Möglichkeit, auch dynamisches SQL zu verwenden? – AAA

+0

Ich kenne keine Möglichkeit, dies mit Dynamic-SQL zu tun. –

+0

@AAA - was meinst du mit "benutze auch dynamisches SQL"? Ich fürchte, Sie verwenden das Wort "dynamisch" nicht in seinem etablierten, technischen Sinne. Suchen Sie nach variablen Tabellen- oder Spaltennamen? Wenn nicht, willst du kein "dynamisches" SQL; anstatt große Wörter zu verwenden, wäre es besser, zu erklären, was Sie wollen, in einfachen, einfachen englischen Wörtern. – mathguy

0

Warum nicht einfach das tun?

select t1.* 
from table1 t1 
where t1.col1 in (select col2 from table2 where rowid = 1); 

EDIT:

Wertelisten in einer einzigen Spalte zu speichern ist so eine schlechte Idee, dass ich die Frage falsch interpretiert. Ich habe die "Werteliste" als die Werte genommen, die in verschiedenen Zeilen gespeichert sind. Warum? Denn das ist der richtige Weg, um die Daten zu speichern. Es ist nicht SQLish, Spalten in einer Liste mit Trennzeichen zu speichern.

Das heißt, wir sind manchmal mit anderen Menschen wirklich schlechte Design-Entscheidungen stecken. Sie können eine Abfrage wie diese verwenden, wenn Sie in dieser Situation sind:

select t1.* 
from table1 t1 
where exists (select 1 
       from table2 t2 
       where rowid = 1 and 
        ',' || t2.col2 || ',' like '%,' || t1.col1 || ',%' 
      ); 
+0

Ich glaube, OP bedeutet, dass 'col2' eine Zeichenfolge ist, die '' val1 ',' val2 ',' val3' 'enthält - dh er möchte, dass die Abfrage als' SELECT * FROM TABLE1 ausgeführt wird. WHERE COL1 IN ('val1', 'val2 ',' val3 ') - oder zumindest lese ich es so. YMMV. :-) –

+0

@BobJarvis. . . Das macht so viel Sinn. Ich hatte das als einen einzelnen Wert in jeder Zeile interpretiert. –

Verwandte Themen