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

7-39 文字列の分割

SQLパズル

テーブル
Val
--------
1234567890
123456あい
12345あい
1234あい
123あい
12あいうえ
1あいうえ
あいうえ
あいうえお

char(10)の文字列の、
先頭5バイトと、残りを出力する。

ただし、5バイト目が2バイトキャラの1バイト目の場合は、
先頭6バイトと、残りを出力する。

出力結果
Val         先頭    残り
----------  -----   -----
1234567890  12345   67890
123456あい  12345   6あい
12345あい   12345   あい
1234あい    1234あ  い
123あい     123あ   い
12あいうえ  12あい  うえ
1あいうえ   1あい   うえ
あいうえ    あいう  え
あいうえお  あいう  えお


SQL

select Val,
case when substrb(Val,5,1) = substr(substrb(Val,5,2),1,1)
then substrb(Val,1,5)
else substrb(Val,1,6) end as 先頭,
case when substrb(Val,5,1) = substr(substrb(Val,5,2),1,1)
then substrb(Val,6)
else substrb(Val,7) end as 残り
from (select cast('1234567890' as char(10)) as Val from dual
union select cast('123456あい' as char(10)) from dual
union select cast('12345あい'  as char(10)) from dual
union select cast('1234あい'   as char(10)) from dual
union select cast('123あい'    as char(10)) from dual
union select cast('12あいうえ' as char(10)) from dual
union select cast('1あいうえ'  as char(10)) from dual
union select cast('あいうえ'   as char(10)) from dual
union select cast('あいうえお' as char(10)) from dual);


解説

substr関数とsubstrb関数を組み合わせて、
5バイト目が、2バイトキャラの1バイト目か判断してます。