LoginSignup
3
1

More than 5 years have passed since last update.

DB2 10.1でユーザ定義関数なしで正規表現を使用する

Posted at

背景

  • DB2でREGEXP_LIKEなどの正規表現を用いる関数が利用できるのは11.1以降
  • 政治的な都合などによりユーザ定義関数は使いたくないor使ってはいけない
  • それでも正規表現が使いたい

試した環境

  • DB2 10.1 on AIX 7.1

使うもの

  • XMLQUERY (XQuery式をSQL内で実行する)
    • XMLQUERY('XQuery式' PASSING 値 AS "変数名")でSQLから値を渡せる
    • 戻り値がXMLなのでそのままではSQL内では使えない
  • XMLCAST (XMLデータをキャストする)
    • XMLCAST(対象 AS 型)でSQLでも使えるようキャストできる
  • XQuery式
    • XMLデータを照会および変更するための言語
    • fn:replace fn:matches などで正規表現が使える

使用例

replace
db2 => VALUES (XMLCAST(XMLQUERY('fn:replace($c, "[0-9]+", " Fuga ")' PASSING 'Hoge123Hoge4Ho' AS "c") AS VARCHAR(32)))

1
--------------------------------
Hoge Fuga Hoge Fuga Ho

  1 レコードが選択されました。
matches
db2 => VALUES (XMLCAST(XMLQUERY('fn:matches($c, "[0-9A-Z]")' PASSING 'hogehoge' AS "c") AS VARCHAR(16)))

1
----------------
false

  1 レコードが選択されました。
replace_for_select
db2 => SELECT ID, NAME, XMLCAST(XMLQUERY('fn:replace($c, "([A-Z])[a-z]+\s?", "$1.")' PASSING NAME AS "c") AS VARCHAR(16)) AS NAME2 FROM TEST_USER

ID   NAME             NAME2
---- ---------------- ----------------
   1 Taro Tanaka      T.T.
   2 Hanako Yamada    H.Y.

  2 レコードが選択されました。

参考

3
1
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
3
1