2017-02-07 2 views
0

Ich habe eine Tabelle mit CSV-Werten als Spalte. Ich möchte diese Spalte in Where-Klausel verwenden, um Teilmenge von CSV zu vergleichen ist vorhanden oder nicht. Zum Beispiel hat Tabelle Werte wieORACLE SQL CSV Spaltenvergleich

1| 'A,B,C,D,E' 

Abfrage:

select id aus Tab wo csv_column enthält 'a, C';

sollte diese Abfrage zurückgeben 1.

Wie dies in SQL erreichen?

Antwort

1

können Sie damit umgehen LIKE verwenden, um sicherzustellen, für jeden Buchstaben/String, den Sie zu entsprechen beabsichtigen, für die drei Arten von Mustern suchen:

SELECT id 
FROM yourTable 
WHERE (csv_column LIKE 'A,%' OR csv_column LIKE '%,A,%' OR csv_column LIKE '%,A') 
     AND 
     (csv_column LIKE 'C,%' OR csv_column LIKE '%,C,%' OR csv_column LIKE '%,C') 

Beachten Sie, dass Spiel für die Teilzeichen A bedeutet, dass entweder A, , ,A, oder ,A erscheint in der CSV-Spalte.

Wir könnten auch eine strukturell ähnliche Abfrage schreiben mit INSTR() anstelle von LIKE, die sogar eine Leistungssteigerung gegenüber der Verwendung von Platzhaltern geben könnte.

+0

Sie brauchen einige Klammern in dort sonst die AND funktioniert nicht wie vorgesehen –

+0

@ChristianPalmer Danke für die Bearbeitung. –

+0

Danke @TimBiegeleisen – Srini2k6

0

gibt es wahrscheinlich flippig etwas, das Sie mit regulären Ausdrücken tun können, aber in einfachen Worten ... wenn A und C werden immer in dieser Reihenfolge seine

csv_column LIKE '%A%C%' 

sonst

(csv_column LIKE '%A%' AND csv_column LIKE '%C%') 
0

Wenn Sie don‘ t möchten, dass Ihre Suchzeichenfolge bearbeiten, könnte dies ein Weg sein:

select * 
from yourTable 
where csv like '%' || replace('A,C', ',', '%') || '%' 

zum Beispiel:

with yourTable(id, csv) as (
    select 1, 'A,B,C,D,E' from dual union all 
    select 2, 'A,C,D,E' from dual union all 
    select 3, 'B,C,D,E' from dual 
) 
select * 
from yourTable 
where csv like '%' || replace('A,C', ',', '%') || '%' 

gibt:

 ID CSV 
---------- --------- 
     1 A,B,C,D,E 
     2 A,C,D,E 

Bedenken Sie, dass dies nur funktioniert, wenn die Zeichen in der Suchzeichenfolge in der gleichen Reihenfolge der CSV-Spalte; zum Beispiel:

with yourTable(id, csv) as (
    select 1, 'C,A,B' from dual 
) 
select * 
from yourTable 
here csv like '%' || replace('A,C', ',', '%') || '%' 

wird keine Ergebnisse

0

Warum nicht speichern die Werte als separate Spalten geben, und dann einfach Prädikat Filterung verwenden?