如何编写 Select 查询以选择 DB2 中多次出现的特定 xml 节点?

How to write Select query for selecting particular xml nodes in DB2 which occur multiple times?

我有一个 XML 结构如下:

<root>
    <firstChild>
        <a>
            <a1>someText</a1>
            <a2>someNumber</a2>
        <a>
        <a>
            <a1>someText1</a1>
            <a2>someNumber1</a2>
        <a>
        <a>
            <a1>someText2</a1>
            <a2>someNumber2</a2>
        <a>
        <a>
            <a1>someText3</a1>
            <a2>someNumber3</a2>
        <a>
    </firstChild>
</root>

我想编写一个 DB2 SQL,它将 return 所有应用程序 ID,其中 a1 为 someText1,a2 为 someNumber1。

有关更多信息,我有一个 table say APPLICATION,其中有 application_xml 作为列。此列包含如上所示的所有 xml 文档,并针对每个应用程序 ID 进行存储。

有人可以建议一下吗。

我试过下面的查询,但没有成功。

select XMLQUERY('copy $new := $application_xml
for $i in $new/root/firstChild/a[a1 = "someText1"], $new/root/firstChild/a[a2 = "someNumber1"]  
return $new') from application

根据您的描述,我假设 table 有两列应用程序 ID (aid) 和 application_xml。正如您想要的那样,return 应用程序 ID 查询的基本结构是

select aid from application

现在我们需要判断哪些行符合条件。您声明在相关 XML 文档中,元素 a1 和 a2 需要具有特定值。函数 xmlexists 是在 SQL 的 WHERE 子句中使用的函数:

select aid from application
where xmlexists('$d/root/firstChild/a[a1 = "someText1" and a2 = "someNumber1"]' passing application_xml as "d")

XMLEXISTS 用作过滤谓词。 "passing" 子句告诉 DB2 在 XPath/XQuery 表达式内的名称 "d" 下期望 "application_xml"。 XPath 表达式本身正在寻找路径 /root/firstChild/a,在特定的 "a" 下,"a1" 和 "a2" 的条件都需要为真。如果你想要更广泛的条件,也有表达方式。