2016-04-12 11 views
2

私は、次の「TABLE1」を持っている:SQLここではOracle PL/SQLのリストを使用していますか?

NAME  JOB  

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

私は宇宙飛行士や医師であるすべての人を選択します。それはメアリー、ジョンとリタを返すはずです。

私は現在持っている:

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) 

をしかし、私はそれを反復処理したいの代わりに、左側に文字列全体を比較する必要はありません。

注:左側の引数は入力引数として取得されているため、SQL内で解析する必要があります。

+0

MSSQL: ' '%の宇宙飛行士%'' – wiretext

+2

MS SQL ServerとOracleの両方のタグのように '%ドクター%' OR JOBなどの どこJOB @temp SELECT * FROMを?どうして? – jarlh

+0

探している2つのジョブが単一の値で提供されることが本当に必要ですか? 'どこか...か....'(tinka提案のような)形式の節も同様に働くだろうか? – Codo

答えて

4

データ形式を修正する必要があります。列にリストを格納しようとしていますが、それは悪い考えです。区切り値ではなくジャンクション表を使用する必要があります。

時には、私たちは他の人の悪い設計決定に悩まされています。 Oracleには強力な正規表現演算子があります。これは認めていません:

select name, job 
from table1 
where regexp_like(job, replace('astronaut,doctor', ',', '|'); 
関連する問題