Home実験室 − No.0041


        No.0041(SQL)
        文字、文字列を探す(INSTR)

■環境
  □OS: Windows XP Professional SP3
  □Oracle: Oracle Database 11g R2 (Standard)
  □OSログインユーザ: ORA_DBAグループ
  □Oracleユーザ: dicdic(実験用ユーザー) → 実験環境構築スクリプト

■実験
  0. 実験ユーザー「dicdic」でコネクトする。

SQL> conn dicdic/Oracle11g 接続されました。 SQL>



  1. INSTR関数は、第一引数の文字列の中から、第二引数の文字列をさがし、その位置(何文字目か)を返す。

SQL> SELECT INSTR('OracleDatabase 11gRelease2','se') FROM DUAL; INSTR('ORACLEDATABASE11gRELEASE2','SE') --------------------------------------- 13 SQL>



  2. 第三引数として検索の開始位置(何文字目から探し始めるか)を与えることができる。
     この例の場合、15文字目から数え始めると、先頭から24文字目に'se'が見つかったという場合。

SQL> SELECT INSTR('OracleDatabase 11gRelease2','se',15) FROM DUAL; INSTR('ORACLEDATABASE11gRELEASE2','SE',15) ------------------------------------------ 24 SQL>



  3. 第三引数として見つかった回数を指定できる。
     下の例の場合、8文字目から探し始め、2回目に見つかった位置を返す。

SQL> SELECT INSTR('OracleDatabase 11gRelease2','se',8,2) FROM DUAL; INSTR('ORACLEDATABASE11gRELEASE2','SE',8,2) ------------------------------------------- 24 SQL>



  4. 検索の際は大文字と小文字を区別する。見つからなかった場合は「0」が返る。

SQL> SELECT INSTR('OracleDatabase 11gRelease2','sE') FROM DUAL; INSTR('ORACLEDATABASE11gRELEASE2','SE') --------------------------------------- 0 SQL>



  5. スペースも検索できる。

SQL> SELECT INSTR('OracleDatabase 11gRelease2',' ') FROM DUAL; INSTR('ORACLEDATABASE11gRELEASE2','') ------------------------------------- 15 SQL>



  6. 全角半角混在である場合にも、あくまで「文字数」を基準にカウントする。

SQL> SELECT INSTR('Oracleデータベース 11gリリース2','デ') FROM DUAL; INSTR('ORACLEデータベース11gリリース2','デ') -------------------------------------------- 7 SQL>



  7. 開始位置にマイナスの数字を指定すると、開始位置を末尾からの文字数で指定できる。
     この例の場合、末尾から4文字目から検索をスタートし、はじめに見つかった「リ」の位置を返す。
     注意! 検索開始位置を末尾からの文字数で指定しても、戻り値は先頭からの位置です。

SQL> SELECT INSTR('Oracleデータベース 11gリリース2','リ',-4) FROM DUAL; INSTR('ORACLEデータベース11gリリース2','リ',-4) ----------------------------------------------- 18 SQL>



  8. だから、下のようになる。馴れないとややこしい....。馴れるほど使わないが。

SQL> SELECT INSTR('Oracleデータベース 11gリリース2','リ',-5) FROM DUAL; INSTR('ORACLEデータベース11gリリース2','リ',-5) ----------------------------------------------- 17 SQL>



  9. せっかくなのでサンプルデータベースを使った例を。
     下の例では氏名英字の文字列からスペースの位置を探させている。
     さらにその数字から1を引けば、苗字の文字数を調べることができる。
     どのようなビジネスシーンで使われるかって訊かれると困るが....
     (実際の見栄は下の絵より相当横長になります)

SQL> select 氏名英字,INSTR(氏名英字,' '),INSTR(氏名英字,' ')-1 苗字の文字数 from TT01_学生 where rownum < 10; 氏名英字 INSTR(氏名英字,'') 苗字の文字数 -------------------- ------------------ ------------ Katsumata Seiichi 10 9 Moriya Hironobu 7 6 Natori Akio 7 6 Takasaki Mitsuyo 9 8 Hasegawa Wataru 9 8 Takai Kokone 6 5 Ooi Hiroshi 4 3 Nagashima Katsuji 10 9 Iwase Toshio 6 5 9行が選択されました。 SQL>



  10. INSTRのほかに、INSTRBというのがあって、バイト数基準で探す関数もあるが、
     これ以上やるとワケがわからなくなるし、あまり使う機会もないと思われるので、
     これ以上深追いしない。したくない。

SQL> SELECT INSTRB('Oracleデータベース 11gリリース2','タ') FROM DUAL; INSTRB('ORACLEデータベース11gリリース2','タ') --------------------------------------------- 11 SQL>





    【PR】    Oracle実験室監修  『Oracleアーキテクチャ鳥瞰図』 PDF  (Oracleのアーキテクチャを一目で俯瞰できるイラスト)  


Home実験室 − No.0041

© 2011-2011   Amateur Laboratory of ORACLE
inserted by FC2 system