LoginSignup
6
3

More than 5 years have passed since last update.

DB2DBA: DB2 11.1新機能 - 正規表現

Last updated at Posted at 2017-02-07

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環境を前提としているようです。

参考資料

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3