トップページに戻る
次の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;
解説