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