LTRIM + RTRIM >TRIM
お気に入りのデータベース管理システムのためにIBMがSQLを機能強化してくれると、私は喜びのあまり、糖尿病薬のCMの俳優Karlos Klaumannsmollerのように踊り出しそうになります。IBMが再び2つのSQL関数を強化して、RPGの関数と同じくらい強力にしてくれたことについて、本日ここにお知らせできることを光栄に思います(まだご存じでない方に向けて)。
ここで取り上げる関数は、LTRIM(左トリム)とRTRIM(右トリム)です。最近まで、これらの関数は、文字列の先頭(左)または末尾(右)からブランク(一部のデータ型の場合は16進ゼロ)を削除できるだけでした。先日、IBMはこれらの関数に2番目のパラメーターを追加しました。そのパラメーターで、文字列から削除する文字セットを指定できるようになりました。唯一、問題があるとすれば、IBM i 7.2以上を稼働する必要がある点です。
この機能強化によってLTRIMおよびRTRIMは、文字列の値から1文字を削除できるTRIMに比べてより強力になります。たとえば、金額の前にあるドル記号と先行ブランクを削除したいとします。TRIMではこの処理はできませんが、LTRIMならできます。
TRIMにも、LTRIMおよびRTRIMに勝る利点が1つあります。それは、1文字を文字列のどちらの端からでも削除できる点です。LTRIMおよびRTRIMは、文字列の片方の端に対してのみ機能します。しかし、LTRIMとRTRIMとを入れ子にすることで、この制約は簡単に回避することができます。
使い道があるかもしれない機能は、リテラル以外の何かで文字のリストを指定することです。次の例では、NonNumericというグローバル変数で文字のリストを指定します。
TRIM、LTRIM、およびRTRIMは埋め込み文字を削除できませんが、REPLACE関数は削除できます。米国で千の位の区切り文字として用いられるコンマを削除してみましょう。
また、構造化されていない文字列から任意のデータを取り出すのには正規表現が有用な場合もあります。次の例では、REGEXP_SUBSTR(別名REGEXP_EXTRACT)関数を使用して埋め込み数字を掘り出します。
この正規表現は、0個以上の数字(\d*)、続いて0個以上のピリオド(\.*)、続いて1個以上の数字(\d+)のパターンを探します。正規表現を使用する場合、ニーズにぴったり合う式を作れるようになるまでには多少時間が掛かるかもしれません。正規表現は税法とほぼ同じくらい不可解です。
これらの関数をうまく組み合わせて使用すれば、必要とする結果を得ることができます。文字列から不必要な文字を削除するには、数多くの方法があるというわけです。
「意志あるところに道は開ける」という古いことわざがありますが、それをもじって「意志あるところに関数は開ける」とでも言えるかもしれません。