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>
|
|