等值谓词的XML索引使用示例
示例展示了等值谓词使用XML索引的情况。
示例 :以下查询包含一个字符串类型的等值谓词。 它从客户表的信息栏中检索所有邮编为95141的客户的文件。
SELECT INFO FROM CUSTOMER
WHERE XMLEXISTS('$x/customerinfo/address[@zip=”95141”]'
PASSING CUSTOMER.INFO AS "x")
为了与该查询兼容,XML索引需要在索引节点中包含 zip 属性节点,并将值作为VARCHAR类型存储在索引中。
查询可以使用这个XML索引:
CREATE INDEX CUST_ZIP_STR on CUSTOMER(INFO)
GENERATE KEY USING XMLPATTERN '/customerinfo/address/@zip'
AS VARCHAR(10)
示例 :假设您将上一个示例中的查询更改为如下形式:
SELECT INFO FROM CUSTOMER
WHERE XMLEXISTS('$x//address[@zip=”95141”]'
PASSING CUSTOMER.INFO AS "x")
上一个示例中的索引 CUST_ZIP_STR 不能用于此查询,因为 XMLEXISTS 谓词中的 XPath 表达式现在指定了索引所指定节点的超集。 在查询中, zip 属性节点位于地址元素下,而地址元素是任何节点的后代。 索引CUST_ZIP_STR仅指定地址元素下的 zip 属性,该地址元素是customerinfo元素的子元素。 定义一个索引,用于本例中的查询:
CREATE INDEX CUST_ZIP_STR2 ON CUSTOMER(INFO)
GENERATE KEY USING XMLPATTERN '//address/@zip'
AS VARCHAR(10)
示例 :以下查询包含一个数字类型的等值谓词。 它从产品表的描述列中检索价格等于 9.99 的项目的文件。
SELECT INFO FROM CUSTOMER
WHERE XMLEXISTS('$x//address[@zip="95141"]'
PASSING CUSTOMER.INFO AS "x")
为了兼容,XML索引需要在索引节点中包含价格节点,并将值存储为DECFLOAT类型。
查询可以使用这个XML索引:
CREATE INDEX PRODINDEX ON PRODUCT(DESCRIPTION)
GENERATE KEY USING XMLPATTERN '//price' AS SQL DECFLOAT
示例 :以下查询包含一个文本节点的等值谓词。 它从客户表样例的“信息”列中检索所有文档,其中助手的名称为 Gopher
Runner。
SELECT INFO FROM CUSTOMER
WHERE XMLEXISTS('$x/customerinfo/assistant[name="Gopher Runner"]'
PASSING BY REF INFO AS "x")
为了与该查询兼容,XML索引需要包含 assistant 元素下的 name 元素中的文本节点,并且需要将索引中的值存储为VARCHAR类型。
查询可以使用这个XML索引:
CREATE INDEX CUSTINDEX on CUSTOMER(INFO)
GENERATE KEY USING XMLPATTERN '/customerinfo/assistant/name/text()'
AS SQL VARCHAR(20)