Ich stehe vor einem Problem im Projekt, an dem ich gerade arbeite. Ich kann Ihnen keinen tatsächlichen Code geben, aber ich habe einen ausführbaren Beispielcode wie unten erstellt.
Hier sind temp
und temp_id
zwei Tabellen
temp
table enthält eine durch Komma getrennte Liste von IDs, die VARCHAR2
ist
temp_id
Tabelle enthält tatsächliche IDs, die NUMBER
sind
Ich möchte Zeilen von temp_id
table durchsuchen, indem ich ids
von einer kommagetrennten Liste von IDs aus temp
table
Diese Abfrage funktioniert nicht
%Vor%Arbeitsabfrage
%Vor% Hier ist der Unterschied zwischen den obigen beiden Abfragen: Ich verwende eine Spalte aus temp
table in der ersten Abfrage und direkt zitierte varchar2
in der zweiten Abfrage. Warum nicht funktioniert nicht? Fehle ich etwas? Ich denke, dass es einen Unterschied zwischen den Datentypen geben kann, aber nicht in der Lage ist, es herauszufinden.
Ihre Anforderung wird als variierende IN-Listen aufgerufen. Siehe Unterschiedliche IN-Werteliste in WHERE Klausel
Grund: IN ('1, 2, 3')
ist NICHT entspricht IN (1, 2, 3)
OR IN('1', '2', '3')
Daher
SELECT * FROM temp_id WHERE daten_id IN (SELECT ids FROM temp);
ist dasselbe wie
SELECT * FROM temp_id WHERE daten_id IN ('1, 2, 3');
was einen Fehler ORA-01722: invalid number
-
NICHT wie
SELECT * FROM temp_id WHERE daten_id IN (1, 2, 3);
was Ihnen eine korrekte Ausgabe geben würde -
%Vor%Lösung:
Für Ihre Anforderung können Sie es so erreichen -
%Vor%Alternativ können Sie Ihre eigene TABLE-Funktion oder eine Pipeline-Funktion erstellen, um dies zu erreichen. Ihr Ziel sollte sein, das Komma zu teilen -eingeteilte IN-Liste in mehrere Zeilen . Wie Sie es tun, liegt an Ihnen!
Arbeitsdemo
Nehmen wir ein Beispiel für die Standardtabelle EMP in SCOTT
schema.
Ich habe eine Liste von Jobs in einer Zeichenfolge und möchte die Mitarbeiter für diese Jobs zählen:
%Vor%Oh! Was ist passiert? Die Standard emp-Tabelle sollte eine Ausgabe 10 ergeben. Der Grund dafür ist die variierende IN-Liste .
Sehen wir uns den richtigen Weg an:
%Vor% Es gibt noch eine andere Möglichkeit, dies zu erreichen, nämlich LIKE
:
(Ich habe REPLACE()
oben verwendet, um den überflüssigen Leerraum in der ID-Liste loszuwerden - macht die Dinge etwas einfacher.) Alternativ könnte man REGEXP_LIKE()
verwenden:
[Die Zeichen caret ( ^
) und dollar-sign ( $
) müssen mit dem Anfang und dem Ende des Strings übereinstimmen - also kann die ID entweder am Anfang des Strings mit etwas übereinstimmen ( endend mit einem Komma oder dem Ende der Zeichenkette) oder etwas, das mit einem Komma beginnt (wiederum mit einem Komma oder dem Ende der Zeichenkette).]