カンファレンスで教わった、余分なブランクを削除する凄技
皆さんは最近、カンファレンスに参加されているでしょうか。参加されていないのだとしたら、もったいないことをしているのかもしれません。私は毎年数回、カンファレンスに出席しており、非常に大きな恩恵を得ています。多くのことを学べますし、日常からの息抜きにもなりますし、何よりも、他の参加者と交流を深めることができます。
先日、ミネアポリスで開催されたRPG & DB2 Summitに参加したのですが、そこで、Kevan Robinson氏という若く聡明な開発者に出会いました。彼を含め、他の参加者に向けてある技法を紹介したところ、彼はその技法についての彼独自の手法を快くも披露してくれました。私が紹介した技法は、何年も前に、メインフレームのエキスパートであるCraig Mullins氏から教わったものでした。次のような技法です。
姓と名前からなる文字フィールドがあり、姓と名前は、他の行の姓と名前と位置揃えされているとします。たとえば、名前は1桁目から、姓は12桁目から始まる、というようにです。
Sam Sung
Willie Makit
Betty Wont
名前の後にある余分なブランクを除去し、ブランクを1つだけ残して名前と姓の区切りにするには、どのようにすればよいでしょうか。
Sam Sung
Willie Makit
Betty Wont
これは、次のようにして行います。
SELECT REPLACE(
REPLACE(
REPLACE(name, ' ', '<>'),
'><', ''),
'<>', ' ')
FROM MyData
そのようにフォーマットするもっと良い方法があるとよいのですが。多少、読みづらいところはあります。ともあれ、どのような動作になるのか見てみましょう。
3番目のREPLACEは最も内側にあるため最初に処理され、各ブランクを<>のペアに置き換えます。2番目のREPLACEは、><のペアをすべて空ストリングに置き換え(つまり、すべて削除し)、結果として最初の<と最後の>が残されます。1番目のREPLACEは最後に処理され、<>を1つのブランクに置き換えます。この技法は素晴らしいと思います。人間の賢明さに感服です。
Kevan氏はわざわざメールをくれ、今では正規表現を使用して同じことを実現できると指摘してくれました。
SELECT REGEXP_REPLACE(name, ' +', ' ')
FROM MyData
Kevan氏はメールで次のように記しています。「REGEXP_REPLACEの2つ目のパラメーター(スペースとそれに続くプラス記号)は、1つ以上のスペースのシーケンスにマッチし、3つ目のパラメーターは、それらのスペースのシーケンスを1つのスペースに置き換えます。」
この技法は何度も披露してきましたが、正規表現を使うことは一度も思い付きませんでした。他の多くの人(すべての人かもしれません)と同様に、私は旧来のやり方にとらわれてしまっているようです(Mullins氏の技法が時代遅れだというわけではありません。それは違います)。
Kevan氏は、さらなるアイデアを提供してくれました。「2つ目のパラメーターを「\s+」に変更すれば、他の種類のホワイト スペース(改行やタブなど)にもマッチし、それらを1つのスペースに置き換えることができます。一部のケースでは、文字列を変更し過ぎてしまうことになるかもしれませんが、Webアプリのコメント フィールドなど、ある種のレガシー データを正規化するのに有用だと思います。」
やるべきことがたくさんあるので、出掛けずに家にいることもできましたが、カンファレンスに参加して良かったと思います。たとえ私がカンファレンス嫌いだとしても、出向くことにはなるのでしょうが。得られる恩恵は実に大きいものがあります。