2016-04-12 10 views
2

Ich habe folgendes „table1“:SQL wo in Listen in Oracle PL/SQL?

NAME  JOB  

Mary  pilot, astronaut, cook 
John  astronaut, biker 
Michael rider 
Rita  teacher, doctor 

ich alle Leute auswählen möchten, die ein Astronaut sind oder Arzt. Es sollte Mary, John und Rita zurückgeben.

ich derzeit haben:

select name from table1 
where 'astronaut,doctor' in (select regexp_substr(table1.job,'[^'',]+', 1, level) 
    from dual 
    connect by regexp_substr(table1.job, '[^'',]+', 1, level) is not null) 

aber ich will nicht die gesamte Zeichenfolge auf der linken Seite vergleichen, sondern ich durchlaufen wollen.

Hinweis: Ich bekomme das linke Argument als ein Eingabeargument, so dass es innerhalb der SQL analysiert werden muss.

+0

MSSQL: 'select * from @temp wo JOB like '% Arzt%' OR JOB like '% Astronaut%'' – wiretext

+2

Beide MS SQL Server und Oracle-Tags? Woher? – jarlh

+0

Ist es wirklich erforderlich, dass die beiden Jobs, die Sie suchen, in einem einzigen Wert bereitgestellt werden? Würde eine Klausel der Form "wo ... oder ...." (wie Tinka vorgeschlagen) ebenfalls funktionieren? – Codo

Antwort

4

Sie sollten Ihr Datenformat reparieren. Sie versuchen, Listen in einer Spalte zu speichern, und das ist eine schlechte Idee. Sie sollten eine Junction-Tabelle anstelle von Begrenzungswerten verwenden.

Manchmal sind wir mit schlechten Designentscheidungen anderer Menschen festgefahren. Oracle verfügt über leistungsstarke Operatoren für reguläre Ausdrücke. Dies erlaubt:

select name, job 
from table1 
where regexp_like(job, replace('astronaut,doctor', ',', '|');