2017-02-22 3 views
0

Wie verwende ich eine Spalte getrennt Feld innerhalb in KlauselWie verwende ich eine Spalte getrennt Feld innerhalb in Klausel

Table 1 (id,requestedColor) 
Data 
1  Red,Green,Black,Orannge, 
2 Blue, 
3 Yellow,Red, 

table 2 (colorname) 
Data 
Red 
Pink 
Green 

ich alle Farben von table 2 für einen bestimmten requestedColumn (von table 1) finden müssen.

+5

Dies ist eine schreckliche Datenbank-Design. Sie sollten erklären, warum Sie ein gefälschtes Design haben - insbesondere, wenn Oracle geschachtelte Tabellen, JSON und XML unterstützt, die ein wenig besser zum Speichern solcher Informationen sind. –

+0

Oder auch nur normale Tabellen :) – BobC

Antwort

2

Sie können dies nicht mit einer IN Bedingung tun, zumindest nicht direkt. Was in der IN-Bedingung in Klammern steht, sollte eine Liste mehrerer separater Zeichenfolgen sein, die durch Kommata getrennt sind. Was Sie in Ihrer ersten Tabelle (in jeder Zeile) haben, ist eine einzelne Zeichenkette - was darin enthalten ist (die Tatsache, dass es zum Beispiel Kommas enthält) ist völlig irrelevant.

Es gibt drei Möglichkeiten, dies zu tun. Einer ist der beste Rat, um Ihr Datenmodell zu reparieren. Halte nicht mehrere Werte in einem einzigen Feld; Dies ist ein Verstoß gegen die absolute Mindestanforderung für das Design von soliden Tischen, bekannt als "First Normal Form".

Andernfalls könnten Sie die Strings teilen und dann IN auf die normale Weise verwenden.

Für diese besondere Übung kann es einfacher sein, Bedingungen zu haben, wie

... where ',' || table1.requestedcolor || ',' like '%,' || table2.colorname || ',%' 

Die verketteten Kommas sind notwendig Situationen wie Red zu vermeiden Dark Red passend usw.

Unabhängig davon, welcher Ansatz wählen Sie (Kurz vor dem richtigen, um Ihre Tabelle zu normalisieren), wird der Code sowohl schwer zu lesen, zu schreiben und zu pflegen als auch ineffizient sein. Es gibt keinen Weg um ihn herum. Das ist der Grund, warum Profis von der ersten Normalform so hartnäckig sind.

+0

Danke. Ich kann das Tabellenmodell nicht ändern. jedoch ist wirklich eine schlaue Idee und es hat wirklich geholfen !! Danke vielmals!! Ich habe ein komplexes Geschäftsbedürfnis und dies ist das Beste, was ich erklären konnte (Daten und Format bleiben gleich). Ich musste eine Spalte in SQL hinzufügen, die ja wäre, wenn "angeforderte Farbe" aus Tabelle 1 in Tabelle 2 vorhanden ist. Nochmals vielen Dank –

+0

@RaviSharma - wenn Sie feststellen, dass die Leistung nicht akzeptabel ist (abhängig von der Menge der zu verarbeitenden Daten), und Wenn table1 relativ klein ist, während table2 (oder sein Äquivalent) Millionen von Zeilen oder mehr hat, ist es möglicherweise besser, die Strings von table1 zu trennen (es gibt viele Threads in StackOverflow, die erklären, wie das gemacht wird), sogar ** innerhalb von ** a einzelne SQL SELECT-Anweisung. Denken Sie daran, falls Sie es brauchen. – mathguy

+0

Ich versuchte mit Split, aber dann konnte ich es nicht in Unterabfrage verwenden.Wählen Sie , Fall wenn vorhanden ist (Wählen Sie 1 von table2 wo PCX in (SELECT REGEXP_SUBSTR (requestedColor, '[^] +', 1, LEVEL) AS "single_col_name" FROM ( SELECT ROWNUM AS ids , requestedColor FROM T1 ) CONNECT BY INSTR (requestedColor, '', 1, LEVEL-1)> 0 ) ), dann 'ja' sonst 'nein' von inner join table1 T1 Es konnte T1 nicht gefunden werden. das Ersetzen der mit Ihrer funktioniert –

0

Stimme zu, was @mathguy sagte; Eine andere (möglicherweise ineffiziente) Methode ist die Verwendung eines regulären Ausdrucks für die Verknüpfung:

select t2.colorname 
from table1 t1 
join table2 t2 on regexp_like(t1.requestedColor, '(^|,)' || t2.colorname || '(,|$)') 
where t1.id = 1 

COLORNAME 
--------- 
Red 
Green 
+1

Nitpick: logisch verstehe ich die Präferenz für '(^ |,)', aber - da reguläre Ausdrücke mit Alternationen in der Reihenfolge der Token im Wechsel versucht werden - für die Effizienz ist es besser, den wahrscheinlichsten Kandidaten zuerst zu setzen. '(, | ^)' und '(, | $)' scheinen mir in allen Fällen die bessere Wahl zu sein. – mathguy

+0

Ich hatte das und tauschte es, nicht sicher warum. Hätte nicht darüber nachgedacht in Bezug auf Effizienz, so gut zu wissen. –

+0

danke. Warum denkst du, dass es nicht effizient ist? –

Verwandte Themen