文字列の編集、部分文字列を取り出す
SUBSTR ( string , position [, length] )
SUBSTRB ( string , position [, length] )
return [ string ]
string | 対象の文字列 | |
position | | |
├ 正の場合 | 取り出したい文字列の開始位置(1〜) | |
├ 0 の場合 | 1を指定したことと同じ | |
└ 負の場合 | 文字の末尾から逆向きに数えた位置 | |
length | 取り出す文字列長 | default 最後まで |
SUBSTR、SUBSTRB 関数の内容
SUBSTR は取り出す文字列をキャラクタ単位、 SUBSTRB はバイト単位で部分文字列の取り出しを行なう。
文字列 string の 開始位置 position から legnth 文字、または、バイト分 の部分文字列 (SUBSTRING) を戻す。
開始位置 position は 1 オリジンで始まるが 0 でも有効で 1 を指定したことになる。また、開始位置 position にマイナス値を指定すると文末から position 逆行した位置から文字列を取り出す。
文字列長 length を省略すると文字の最後までが対象となり、0 以下の数値も指定できるが結果は常に NULL を戻す。
BASIC にあるような左から length 文字 (left) 、右から length 文字 (right) のような個別の関数は用意されていない。
SUBSTR と SUBSTRB 以外にも同じ目的で各国語キャラクタセットに使用する特定のコードポイント向けの関数がある。
- SUBSTRC : 完全な Unicode 用
- SUBSTR2 : UCS2 用
- SUBSTR4 : UCS4 用
注意点
SUBSTRB の場合には漢字などのマルチバイト文字の途中から取り出すとバイト単位に切り分けた文字化けするバイトコードが戻るというわけではなくスペース(' ') が代替抽出される。マニュアルではこの点について説明されていない。未来のバージョンまで、この振る舞いが保証はされていないと考えておかないと将来バグになる可能性がある。
このような場合を文字の 泣き別れ と呼ばれることがある。(泣き別れは、川の分水界のこと)
SUBSTR、SUBSTRB 使用例
開始位置 position のみを指定した場合(結果を見やすくするために半角スペースを '_' に加工している)
SQL> select s, str, SUBSTR(str,s) sub_str, SUBSTRB(str,s) sub_strb
2 from substr_sample;
S STR SUB_STR SUB_STRB
---- ---------------- ---------------- ----------------
1 ひらがな ひらがな ひらがな
0 ABC ABC ABC
2 ハンカク カタカナ ンカク カタカナ ンカク カタカナ
2 全角キャラクタ 角キャラクタ _角キャラクタ
1 バイト バイト バイト
-3 日本語 日本語 _語
開始位置 position と文字列長 length を指定した場合
SQL> select s, e, str, SUBSTR(str,s,e) sub_str, SUBSTRB(str,s,e) sub_strb
2 from substr_sample;
S E STR SUB_STR SUB_STRB
---- ---- ---------------- ---------------- ----------------
1 5 ひらがな ひらがな ひら_
0 5 ABC ABC ABC
2 2 ハンカク カタカナ ンカ ンカ
2 3 全角キャラクタ 角キャ _角
1 2 バイト バイ バ
-3 1 日本語 日 _ ← 「本」の右半分
コード長について
Shift-JIS 環境において半角カタカナは1バイトであるが EUC-JP では 2バイト UTF-8 では 3バイトになる。
UTF8 では全角文字一般が 3バイト 詳しくは 文字コードについて 参照
SQL 関数 - SUBSTR,SUBSTRB 関連
- 部分文字列の位置を求める ⇒ instr ( s1, s2, p, o )
- 文字列の長さを求める ⇒ length ( s )
- 数値文字列の先頭の 0 を取り除く ⇒ ltrim ( s, t )
- 文末の空白を取り除く ⇒ rtrim ( e, s )
- 文字列の長さを一定に揃える ⇒ rpad ( s1, n, s2)
- NULL を別の値に変換する ⇒ nvl ( e1, e2 )
- 文字列同士を結合する ⇒ concat ( s1, s2 )
- 辞書順、五十音順に並び替える ⇒ [ order by ] nlssort ( e , s )
- 正規表現でマッチする文字を切り出す ⇒ regexp_substr ( s, p )
- 文字列中からトークンを切り出す ⇒ strtoken( s, d, p )