“混合型” 盘考
您曾经看到了若何编写 XQuery 来检索 XML 文档片段、建树 XML 输出的新方式以及根据在盘考自己指定的前提前往分歧的输出。这些都是盘考 DB2 中存储的 XML 数据的简双设施。
您要晓得,关于 XQuery 要学习的内容远比本教程讨论的多得多。但是,有一个主题是我们不克不及忽略的:若何编写同时网罗 SQL 和 XQuery 表达式的盘考。若是需求让盘考同时根据 XML 和非 XML 列值中缀过滤,那么就需求驾驭这种技术。
由于本教程紧张关注 XQuery 并将它用作顶级语言,以是我们先钻研若何将 SQL 嵌入 XQuery 中。但肯定要留意,也可以给与相反的做法 —— 将 XQuery 嵌入 SQL 中。在本教程末尾,您会看到这种做法的一个冗长示例。但是,关于 SQL/XML 以及若何将 XQuery 嵌入 SQL 中的更多信息,请拜见 参考材料。
将 SQL 嵌入 XQuery 中
要将 SQL 嵌入 XQuery 中,需求哄骗 db2-fn:sqlquery
函数替换 db2-fn:xmlcolumn
函数。db2-fn:sqlquery
函数实行一个 SQL 盘考并只前往选择的数据。通报给 db2-fn:sqlquery
的 SQL 盘考必需只前往 XML 数据;这使 XQuery 可以进一步处置赏罚 SQL 盘考的了局。
我们用一个示例将曾经讨论的很多不雅点连系起来。假定盼愿取得住在 San Jose 的 Gold 客户的全部电子邮件地点。若是一个客户有多个电子邮件地点,那么盼愿这些地点在输出中是同一个记录的构成局部。最初,若是吻合前提的 Gold 客户没有提供电子邮件地点,那么盼愿检索他的邮政地点。编写这样的盘考的一种设施如下:
清单 35. 将 SQL 嵌上钩罗前提逻辑的 XQuery 中
xquery
for $y in
db2-fn:sqlquery('select contactinfo from clients where status=''Gold'' ')/Client
where $y/Address/city="San Jose"
return (
if ($y/email) then <emailList>{$y/email}</emailList>
else $y/Address
)
我们过细看看第三行,这里嵌入了一个 SQL 语句。这个 SELECT
语句网罗一个基于 status
列的盘考谓词,将这个 VARCHAR
列的值与字符串 Gold 中缀角力计算。在 SQL 中,这样的字符串要突围在单引号中。固然这个示例看起来仿佛哄骗了双引号,但实际上是在角力计算值前后哄骗了两个单引号(''Gold'')。“额定的” 单引号是本义字符。若是在基于字符串的盘考谓词外哄骗双引号替换单引号,就会出现语法错误。
这个盘考的输出是:
清单 36. 盘考输出
<emailList>
<email>
love2shop@yahoo.com
</email>
<Address>
<street>
1204 Meridian Ave.
</street>
<apt> 4A
</apt>
<city>
San Jose
</city>
<state>
CA
</state>
<zip>
95124
</zip>
</Address>
将 XQuery 嵌入 SQL 中
肯定要留意,也可以将 XQuery 嵌入 SQL 中。实际上,DB2 9 提供了对类型 SQL/XML 函数的撑持,这些函数屡次用来组织以 SQL 为最外层(即顶级)语言的混合型盘考。固然详细讨论 DB2 的 SQL/XML 撑持赶过了本教程的范围,但至少有两个函数值得留意:
XMLExists
- 批准导航到 XML 文档中的一个元素(或其他类型的节点)并对特定的前提中缀测试。在 SQL
WHERE
子句中指按时,XMLExists
将前往的了局限定为那些网罗餍足指定前提(即指定的前提为 “true”)的 XML 文档的行。您可以猜到了,应该将 XQuery 表达式作为输出通报给XMLExists
函数,从而导航到文档中感兴趣的节点。 XMLQuery
- 批准将 XML 放到 SQL/XML 盘考前往的 SQL 了局齐集。它平日用来从 XML 文档中检索一个或多个元素。异常,
XMLQuery
函数也以 XQuery 表达式作为输出。
思索以下盘考。这个盘考将 SQL 用作顶级语言并网罗对 XMLQuery
和 XMLExists
函数的挪用:
清单 37. 将 XQuery 途径表达式嵌入 SQL 来获取和限定 XML 数据
select name, status,
xmlquery('$c/Client/phone/home' passing contactinfo as "c")
from clients
where xmlexists('$y/Client/Address[zip="95032"]' passing contactinfo as "y")
这个盘考前往的了局集包罗客户姓名、形状和家庭德律风号码列。前两列网罗 SQL VARCHAR 数据,第三列网罗从吻合前提的 XML 文档中提取的一个 XML 元素。我们来过细看看这个盘考的第二行和第四行。
第二行在 SELECT
子句中挪用 XMLQuery
,这示意这个函数前往的了局应该作为 SQL 了局齐集的一列。我们指定一个 XQuery 途径表达式作为这个函数的输出,这个表达式让 DB2 导航到 Client 元素上面的 phone 元素的 home 子元素。这个途径表达式引用一个变量($c),这个变量引用 contactinfo 列。
第四行在 SQL WHERE
子句中挪用 XMLExists
,这示意 DB2 应该根据一个 XML 谓词对了局中缀限定。这个谓词是在途径表达式中指定的,它示意我们只对具有特定邮政编码的客户感兴趣。异常,作为这个 SQL/XML 函数的输出提供的途径表达式界说一个变量(在这个示例中是 $y),这个变量标识 DB2 将在那里探求 XML 文档(在 contactinfo 列中)。
马虎 示例数据,这个盘考的输出是一个单行的了局集,其值如下:
清单 38. 盘考输出
Lisa Hansen Silver <home>4083332222</home>
关于 DB2 的 SQL/XML 撑持的更多信息,拜见 参考材料。
版权声明:
原创作品,批准转载,转载时请务必以超链接方式标明文章 原始情由 、作者信息和本声明。否则将究查执法责任。