2016-04-12 11 views
2

aşağıdaki "table1" bulunmaktadır:SQL, Oracle PL/SQL'deki listelerin neresinde?

NAME  JOB  

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

astronot YA doktor olan tüm insanları seçmek istiyorum. Mary, John ve Rita'yı iade etmeli.

Şu anda var:

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) 

Ancak, sol taraftaki bütün dizeyi karşılaştırmak istemiyorum, onun yerine ben yineleme yapmak istiyorum.

Not: Soldaki argümanı giriş argümanı olarak alıyorum, bu yüzden sql içinde ayrıştırılması gerekir.

+0

MSSQL: Bu izin vermez '@temp seçin * nerede '% astronot%'' – wiretext

+2

MS SQL Server ve Oracle Hem etiketleri gibi '% doktor%' VEYA İŞ gibi İŞ? Nasıl olur? – jarlh

+0

Gerçekten aradığınız iki işin tek bir değerde sunulması zorunlu mu? Bir teneke "nerede ... veya ...." (teneke gibi önerildi) formu da işe yarar mı? – Codo

cevap

4

Veri biçiminizi düzeltmelisiniz. Listeleri bir sütunda depolamaya çalışıyorsunuz ve bu kötü bir fikir. Sınırlandırılmış değerler yerine bir bağlantı tablosu kullanmalısınız.

Bazen, başkalarının kötü tasarım kararlarıyla uğraşıyoruz. Oracle güçlü normal ifade işleçleri var.

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