SELECT aus Tabelle mit variierender IN-Liste in der WHERE-Klausel

8

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

  1. temp table enthält eine durch Komma getrennte Liste von IDs, die VARCHAR2 ist
  2. 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

abrufe %Vor%

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.

    
eatSleepCode 02.01.2015, 06:39
quelle

2 Antworten

6

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 -

auslösen würde %Vor%

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%     
Lalit Kumar B 02.01.2015, 07:59
quelle
0

Es gibt noch eine andere Möglichkeit, dies zu erreichen, nämlich LIKE :

%Vor%

(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:

%Vor%

[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).]

    
David Faber 03.01.2015 01:10
quelle

Tags und Links