XML型で検索する際、XMLCASTを使ってるのを見かけたことがあるのですが、 XMLEXISTSを使ったほうがいいです。
WHERE句にXMLCASTを使った場合
SELECT
*
FROM
CUSTOMER
WHERE
XMLCAST(XMLQUERY('$d/customerinfo/addr/city' passing INFO AS "d") AS VARCHAR(50)) = 'Toronto'
WHERE句にXMLEXISTSを使った場合
SELECT
*
FROM
CUSTOMER
WHERE
XMLEXISTS('$d/customerinfo/addr[city="Toronto"]' passing INFO as "d")
;
XMLEXISTSを使った場合のメリット
インデックスが使える
XMLCASTの場合、インデックスが効かない。ちなみに上記のSQLの場合のインデックスは以下となる。
CREATE
INDEX IDX_CITY ON
CUSTOMER(INFO) GENERATE KEY
USING XMLPATTERN '/customerinfo/addr/city' AS SQL VARCHAR(50);
複雑な表現を1行で書ける。
記述はXPATHと同じ表記する。OR条件なども簡単に記述できる。
SELECT
*
FROM
CUSTOMER
WHERE
XMLEXISTS('$d/customerinfo/addr[city="Toronto" or city="Wood"]' passing INFO as "d")
;
XPATH表記なので要素の途中にも条件を入れることができる。
SELECT
*
FROM
CUSTOMER
WHERE
XMLEXISTS('$d/customerinfo[@id="2"]/addr[city="Toronto" or city="Wood"]' passing INFO as "d")
;