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

More than 1 year has passed since last update.


背景


  • 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 レコードが選択されました。



参考