
■ 住所の名寄せがしたい
蓄積された現場の名称を、入力のブレを除いて一つに纏めたいという要望がありまして、即座に「完全には無理です」って答えたら「完全でなくても良いから何とかしてくれ」と返されました。
...名寄せって、凄い難しいんだけどなぁ。
前回、文字列から前後空白を除くっていう記事(SQL(Oracle)で文字列から前後空白を除去したい)を書いたのですが、実はそれもこの要望への対応の為だったりします。
環境は、Oracle11gです。
■ 連続空白を消したい
入力されているのは、こんなデータです(全角スペースは□で表記)。
札幌市□ハリコフ邸
札幌市□□ハリコフ邸
札幌市□□□ハリコフ邸
これを、「札幌市□ハリコフ邸」に纏めたいのです。単純に、文字列中の空白を全部消しても良いのなら楽なのですが、一つは空白を残すとなると少し悩みます。
ちなみに、データに対して事前に半角スペースを全角スペースに変換(REPLACE関数を使用)と、前後空白の除去を実施しています。
■ 正規表現
Oracle10gから、正規表現を使用した文字の置換を可能とするREGEXP_REPLACEって関数が使えるようです。
対象文字、正規表現(置換文字)、置換文字の順に指定します。
SELECT REGEXP_REPLACE('札幌市□ハリコフ邸', '□+', '□'),
REGEXP_REPLACE('札幌市□□ハリコフ邸', '□+', '□'),
REGEXP_REPLACE('札幌市□□□ハリコフ邸', '□+', '□')
FROM DUAL
正規表現の「□+」は、最低でも1個の□が連続するって意味になるそうです。正規表現って便利だと思うのですが、日頃使わないので今一つ自信がないんですよね。
実行結果は三つとも「札幌市□ハリコフ邸」になったので、目的は達成です。
■ 後書き
REGEXP_REPLACE関数は、この手の関数にありがちな条件指定のパラメータ設定(大文字小文字の区別とか)がいろいろ出来そうなのですが、今回は「連続する空白を一つにする」だけなので、その手のパラメータは省略しています。
前回の前後空白の除去と、今回の連続空白の除去でだいぶ纏まってきたのですが、まだ足りません。
実際には、半角カタカナを全角カタカナへ置換、長音符を半角ハイフォンに置換、1バイト文字を2バイト文字に変換とか、記号の入力の自動変換(、を,に変換)など、小細工をいろいろとしています。
気が向いたら、そのあたりも書いていくかも知れません。
スポンサードリンク


