2005.05.02

「文字列に数字が無い」という条件でレコードを抽出する方法

「Oracleで数字判定の関数は有るの?」と聞かれ、
私には今までOracle側でその機能が状況が無かったので、
どうするれば実現できるか少し考えてみました。

数字の存在チェックの方法ですが、以下の二つの関数を使用する。
○INSTR関数(文字列のなかの文字列検索)
文字列の中の検索した文字が何番目に有るかを返します。
INSTR('ABCDEFG','F') は 6 となります。

○TRANSLATE関数(文字列を変換後文字列に変換)
TRANSLATE('AA12345TEST','0123456789','**********') は 'AA*****TEST' となります。
TRANSLATE('AA12345TEST','0123456789','*@@ZZ*****') は 'AA@@ZZ*TEST' となります。

*注意
REPLACE関数という文字列置換関数も有りますが、TRANSLATE関数とは動きが違います。
REPLACE('A*B*C','*','@') は 'A@B@C' となります。

REPLACE('AA12345TEST','123','@') は 'AA@45TEST'
TRANSLATE('AA12345TEST','123','@') は 'AA@45TEST'
と結果は同じですが意味は違います。
REPLACEは'123'が'@'に変わり、
TRANSLATEでは'1'が'@'に変わり、'2''3'が''に変わります。

さて、数字の存在チェックですが、
INSTR( TRANSLATE( フィールド名 ,'*0123456789','@**********'), '*') > 0
を条件に指定します。
'*'を'@'に変換し、数字を'*'に変換し、*が何文字目かに有れば数字が存在するということになります。
数字の個数で判断したい場合は'*'を抜き出して数えることで実現できると思われます。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
nitta