等值谓词的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)