社内SEの徒然なる日記

SQL(Oracle)で連続する空白を一つにしたい

■ 住所の名寄せがしたい

蓄積された現場の名称を、入力のブレを除いて一つに纏めたいという要望がありまして、即座に「完全には無理です」って答えたら「完全でなくても良いから何とかしてくれ」と返されました。

...名寄せって、凄い難しいんだけどなぁ。

前回、文字列から前後空白を除くっていう記事(SQL(Oracle)で文字列から前後空白を除去したい)を書いたのですが、実はそれもこの要望への対応の為だったりします。

環境は、Oracle11gです。

■ 連続空白を消したい

入力されているのは、こんなデータです(全角スペースは□で表記)。

札幌市□ハリコフ邸
札幌市□□ハリコフ邸
札幌市□□□ハリコフ邸


これを、「札幌市□ハリコフ邸」に纏めたいのです。単純に、文字列中の空白を全部消しても良いのなら楽なのですが、一つは空白を残すとなると少し悩みます。

ちなみに、データに対して事前に半角スペースを全角スペースに変換(REPLACE関数を使用)と、前後空白の除去を実施しています。

■ 正規表現

Oracle10gから、正規表現を使用した文字の置換を可能とするREGEXP_REPLACEって関数が使えるようです。

対象文字、正規表現(置換文字)、置換文字の順に指定します。

SELECT REGEXP_REPLACE('札幌市□ハリコフ邸', '□+', '□'),
REGEXP_REPLACE('札幌市□□ハリコフ邸', '□+', '□'),
REGEXP_REPLACE('札幌市□□□ハリコフ邸', '□+', '□')
FROM DUAL


正規表現の「□+」は、最低でも1個の□が連続するって意味になるそうです。正規表現って便利だと思うのですが、日頃使わないので今一つ自信がないんですよね。

実行結果は三つとも「札幌市□ハリコフ邸」になったので、目的は達成です。

■ 後書き

REGEXP_REPLACE関数は、この手の関数にありがちな条件指定のパラメータ設定(大文字小文字の区別とか)がいろいろ出来そうなのですが、今回は「連続する空白を一つにする」だけなので、その手のパラメータは省略しています。

前回の前後空白の除去と、今回の連続空白の除去でだいぶ纏まってきたのですが、まだ足りません。

実際には、半角カタカナを全角カタカナへ置換、長音符を半角ハイフォンに置換、1バイト文字を2バイト文字に変換とか、記号の入力の自動変換(、を,に変換)など、小細工をいろいろとしています。

気が向いたら、そのあたりも書いていくかも知れません。

スポンサードリンク

PageTop

コメント


管理者にだけ表示を許可する