トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

4-8 文字の検索

SQLパズル

Strテーブル
キー  検索項目
----  --------------
A001  01,03,06,09
A002  01
A003  null
A004  01,02,03,05,10
A005  03,08,10

検索項目は、01、02、03、04、05、06、07、08、09が、
カンマ区切りでセットされている

条件ア  01が含まれる
条件イ  01と03が含まれる
条件ウ  01または08が含まれる
として条件を満たすかを出力する

出力結果
キー  検索項目           ア      イ       ウ
----  --------------  ------  ------  ------
A001  01,03,06,09       True    True    True
A002  01                True   False    True
A003  null             False   False   False
A004  01,02,03,05,10    True    True    True
A005  03,08,10         False   False    True
こちらを参考にさせていただきました


データ作成スクリプト

create table Str(キー,検索項目) as
select 'A001','01,03,06,09' from dual union
select 'A002','01' from dual union
select 'A003',null from dual union
select 'A004','01,02,03,05,10' from dual union
select 'A005','03,08,10' from dual;


SQL

--■■■instr関数を使う方法■■■
select キー,検索項目,
case when 0 < instr(検索項目,'01')
     then 'True' else 'False' end as ア,
case when 0 < all(instr(検索項目,'01'),instr(検索項目,'03'))
     then 'True' else 'False' end as イ,
case when 0 < any(instr(検索項目,'01'),instr(検索項目,'03'))
     then 'True' else 'False' end as ウ
from Str;

--■■■正規表現を使う方法(10g以降)■■■
select キー,検索項目,
case when 0 < instr(検索項目,'01')
     then 'True' else 'False' end as ア,
case when 0 < all(instr(検索項目,'01'),instr(検索項目,'03'))
     then 'True' else 'False' end as イ,
case when RegExp_Like(検索項目,'01|03')
     then 'True' else 'False' end as ウ
from Str;


解説

Oracle11gR2の正規表現は、先読みが使えないので
条件イでは、instr関数でチュックしてます。