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

10-209 指定文字のn番目の前まで取得

SQLパズル

strTable
ID  stringVal
--  ------------
 1  test_100_1_1
 2  test_12_2_3
 3  test_1_10_1
 4  test_1_10_15
 5  test_1_10
 6  test_a_b_
 7  test_1

行頭から3文字目のアンダーバーの前までの文字列を取得する。
ただし、アンダーバーの数が3未満なら
文字列そのものを取得する。

出力結果
ID  before        after
--  ------------  ----------
 1  test_100_1_1  test_100_1
 2  test_12_2_3   test_12_2
 3  test_1_10_1   test_1_10
 4  test_1_10_15  test_1_10
 5  test_1_10     test_1_10
 6  test_a_b_     test_a_b
 6  test_1        test_1

こちらを参考にさせていただきました(英語)


データ作成スクリプト

create table strTable(ID,stringVal) as
select 1,'test_100_1_1' from dual union
select 2,'test_12_2_3'  from dual union
select 3,'test_1_10_1'  from dual union
select 4,'test_1_10_15' from dual union
select 5,'test_1_10'    from dual union
select 6,'test_a_b_'    from dual union
select 7,'test_1'       from dual;


SQL

col after for a15

--■■■正規表現を使う方法(10g以降)■■■
select ID,stringVal as before,
RegExp_Replace(stringVal,'^([^_]*(_[^_]*){2}).*$','\1') as after
  from strTable
order by ID;

--■■■正規表現を使わない方法■■■
select ID,
stringVal as before,
case instr(stringVal,'_',1,3)
when 0 then stringVal
else substr(stringVal,1,instr(stringVal,'_',1,3)-1) end as after
from strTable
order by ID;


解説

正規表現を使わない方法では、
instr関数で第4引数を指定してます。

instr関数のマニュアル
instr関数のマニュアル(英語)