2016年6月にリリースされた11.1より、ようやくDB2でもSQL内で正規表現が使えるようになりましたた。
概要
正規表現の実装は各RDBMSでまちまちですが、DB2ではOracleと互換性のある以下の組み込み関数が提供されます(一部はDB2独自)。
関数名 | 機能 |
---|---|
REGEXP_LIKE | ストリング内に正規表現パターンがあるかどうかを示すブール値を戻します。 |
REGEXP_COUNT | ストリング内で正規表現パターンが一致した回数のカウントを戻します。 |
REGEXP_MATCHCOUNT | REGEXP_COUNTと同様 |
REGEXP_SUBSTR | 正規表現パターンに一致したストリング内のサブストリングの出現箇所を 1 つ戻します。 |
REGEXP_EXTRACT | REGEXP_SUBSTRと同様 |
REGEXP_INSTR | return_option 引数の値に応じて、一致したサブストリングの開始位置または終了位置を戻します。 |
REGEXP_REPLACE | ソース・ストリング内の正規表現パターンの出現箇所を、指定された置換ストリングに置き換えた変更バージョンのソース・ストリングを戻します。 |
使用例
SELECT * FROM table WHERE REGEXP_LIKE(column, pattern)
上記のように検索条件に使用できるのはもちろんですが、チェック制約を柔軟に記述できるようになる点でも有用と思われます。以下は正規表現でIPアドレスとしてクラスBプライベートアドレスのみを受け付けるチェック制約を定義してみた例です。
db2 => create table servers(hostname char(8) not null primary key, ip varchar(15) not null)
DB20000I SQL コマンドが正常に完了しました。
db2 => alter table servers add constraint priv_class_b check (regexp_like(ip, '^172\.(?:1[6-9]|2[0-9]|3[0-1])(?:\.(?:25[0-5]|2[0-4][0-9]|[0-1]?[0-9][0-9]?)){2}$'))
DB20000I SQL コマンドが正常に完了しました。
db2 => insert into servers values ('host0001', '172.16.0.1')
DB20000I SQL コマンドが正常に完了しました。
db2 => insert into servers values ('host0002', '172.16.0.256')
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
SQL0545N 行がチェック制約 "SVC34.SERVERS.PRIV_CLASS_B"
を満たしていないために、要求された処理は実行されません。 SQLSTATE=23513
db2 => insert into servers values ('host0003', '172.32.0.1')
DB21034E コマンドが、有効なコマンド行プロセッサー・コマンドでないため、 SQL
ステートメントとして処理されました。 SQL 処理中に、次のエラーが返されました。
SQL0545N 行がチェック制約 "SVC34.SERVERS.PRIV_CLASS_B"
を満たしていないために、要求された処理は実行されません。 SQLSTATE=23513
11.1以前の場合
DB2 11.1以前でどうしても正規表現を使いたい場合は、developerWorksで正規表現のユーザー定義関数が公開されているのでこれを用いるとよいかもしれません。UTF-8環境を前提としているようです。
参考資料
-
IBM Knowledge Center
- DB2 for Linux UNIX and Windows 11.1.0
-
IBM developerWorks日本語版