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")
;