查询 XML 数据时的 XMLEXISTS 谓词
XMLEXISTS 谓词确定 XQuery 表达式是否返回一个或多个项的序列。 如果在此谓词中指定的 XQuery 表达式返回空序列,那么 XMLEXISTS 返回 false;否则,返回 true。
可以在 SELECT 语句的 WHERE 子句中使用 XMLEXISTS 谓词。 这种用法表示可以使用存储的 XML 文档中的值来限制 SELECT 查询作用于的行集。
For example, the following SQL query shows how the XMLEXISTS predicate can be used to restrict the rows returned, to only those that contain an XML document with a <city> element that has the value "Toronto". (请注意,XQuery 表达式区分大小写,而 SQL 不区分大小写。)
SELECT Cid
FROM CUSTOMER
WHERE XMLEXISTS ('$d//addr[city="Toronto"]' passing INFO as "d")
请注意,在 XMLEXISTS 的 XQuery 表达式中将值传递给 XQuery 变量的方式。 在此示例中,XQuery 变量 $d 绑定至 CUSTOMER 表的 INFO 列中的文档。 还提供了用于传递列名而不必在 passing 子句中显式指定名称的较简单语法。 请参阅 使用 XMLEXISTS , XMLQUERY 或 XMLTABLE 传递简单列名。
确保正确指定了 XMLEXISTS 中的 XQuery 表达式,以便返回期望的结果。 例如,假定 CUSTOMER 表的 XML INFO 列中存储了多个文档,但只有一个文档包含值为 1000 的 Cid 属性(沿指定的路径):
<customerinfo Cid="1000">
<name>Kathy Smith</name>
<addr country="Canada">
<street>5 Rosewood</street>
<city>Toronto</city>
<prov-state>Ontario</prov-state>
<pcode-zip>M6W 1E6</pcode-zip>
</addr>
<phone type="work">416-555-1358</phone>
</customerinfo>
由于 XQuery 表达式中的细微差别,下列两个查询返回不同的结果:
SELECT *
FROM CUSTOMER
WHERE XMLEXISTS ('$d/customerinfo[@Cid=1000]' passing INFO as "d")
SELECT *
FROM CUSTOMER
WHERE XMLEXISTS ('$d/customerinfo/@Cid=1000' passing INFO as "d")
第一个查询如期望的那样返回包含上面显示的 XML 文档的行。 但是,第二个查询返回 CUSTOMER 表的所有行,原因是对于指定的 XQuery 表达式,XMLEXISTS 谓词总是返回 true。 第二个查询中的 XQuery 表达式返回布尔项的序列(它是非空序列),从而导致 XMLEXISTS 总是返回 true。 然后,这将导致选择 CUSTOMER 表中的每一行,但这不是想要的结果。