部分文字列の出現位置を検索する  

INSTR ( string , substring [, position [, occurrence]] ) 
INSTRB ( string , substring [, position [, occurrence]] )  
return [ number ] 

| string | 対象の文字列 |  | 
| substring | 検索する文字列 |  | 
| position 正の場合 | 検索対象文字列の検索開始位置(1〜) | default 1 | 
| position 負の場合 | 文字の末尾から逆向きに数えた位置 |  | 
| position 0 の場合 | (要注意)常に未検出(0)を戻す |  | 
| occurrence | 取り出すまでの検知回数 | default 1=最初 | 


 
INSTR、INSTRB 関数の内容
文字列 string 中の 検索文字列 substring を検索し、その検索文字列が現れた 文字、または、バイトの位置を示す正数を戻す (1 オリジン) 
開始位置 position、検知回数 occurrence のデフォルトはともに 1 
開始位置 position にマイナス値を指定すると 文末から文頭 に向けて検索する。マイナスを指定しても戻り値の出現位置は先頭からの正数となる。
INSTR、INSTRB 以外にも各国語キャラクタセットに使用する特定のコードポイント向けの関数がある。
- INSTRC : 完全な Unicode 用
- INSTR2 : UCS2 用
- INSTR4 : UCS4 用
注意点
INSTR、INSTRB の 検索対象文字列の検索開始位置 position は 開始位置を 0 に指定してもエラーにならないが SUBSTR の 開始位置 position とは異なり 1 にも置換されない。実行結果としては常に「0:未検出」が戻される。
INSTR 使用例
文字列 'ABCdefGHIABC' から 検索文字列 'def' を探す
INSTR('ABCdefGHIABC', 'def') ⇒ 4
          ↑ 4文字目
検索開始位置 position がマイナスの例
INSTR('ABCdefGHIABC', 'ABC', -1) ⇒ 10
                ↑ 10文字目
検索開始位置 position がマイナスで 検知回数 occurrence が 2 以上の例
INSTR('ABCdefGHIABC', 'ABC', -1, 2) ⇒ 1
      ↑        ↑
      |      1回目の検出
    2回目の検出
SQL> select str, subs, s, oc, INSTR(str, subs, sp, oc) instr_pos
  2   from instr_sample;
 
STR                                      SUBS         SP   OC INSTR_POS
---------------------------------------- ---------- ---- ---- ---------
あかまきがみ。あおまきがみ。きまきがみ。 まきがみ      1    1         3
あかまきがみ。あおまきがみ。きまきがみ。 まきがみ      1    2        10
あかまきがみ。あおまきがみ。きまきがみ。 まきがみ     -1    1        16
あかまきがみ。あおまきがみ。きまきがみ。 まきがみ     -7    2         3
あかまきがみ。あおまきがみ。きまきがみ。 まきがみ      0    1         0
                                                      ^^             ^^
                            -- 注意:ゼロを指定すると ↑       未検出↑になる
 
関連 SQL 関数  
- 部分文字列を切り出す ⇒  substr ( s1, p, l )
- 文字列の長さを求める ⇒  length ( s )
- 文字列を文字単位に置換する ⇒  translate ( e, f, t ) 
- 文字列を単語レベルで置換する ⇒  replace ( s1, s2, r )
- 英文字の全てを小文字に変換する ⇒  lower ( s )
- 正規表現でマッチする文字の位置を調べる ⇒ regexp_instr ( s, p )  
- 半角カナを全角かなに変換する ⇒  to_full_kana ( s, t )   
- 全角空白と半角スペースを取り除く ⇒  trim_multi ( s, r )  
- 文字列中からトークンを切り出す ⇒ strtoken( s, d, p ) 