首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >XMLExists或ExistsNode:当在FROM子句中使用两个XML引用时,在WHERE子句中使用

XMLExists或ExistsNode:当在FROM子句中使用两个XML引用时,在WHERE子句中使用
EN

Stack Overflow用户
提问于 2020-12-11 05:58:07
回答 1查看 45关注 0票数 1

我有一些看起来很像下面这样的XML数据:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="UTF-8"?>

<data>
    <context>
        <docNbr>
          1234
        </docNbr>
        <thisType>

我想要做的是使用一个表别名,它只在某个类型存在时才从这个XML中选择字段(我想在使用WHERE子句时使用XMLExists或ExistsNode,但没有成功)。这样我就可以有条件地在两个不同的XML片段之间呈现数据。例如,我可能有这样的数据:

代码语言:javascript
运行
复制
<data>
    <context>
        <docNbr>
          1234
        </docNbr>
        <thatType>

下面是本例中我的两个别名表:

代码语言:javascript
运行
复制
thisType as (
 SELECT x.xml_id, c.*,
 'thisType' as type
   FROM xml x,
        XMLTABLE('//data'
          PASSING x.data
          COLUMNS
             docNbr PATH '//context/docNumber'
            WHERE XMLEXISTS('$INFO//data/context/thisType'
                 passing x.data as "INFO")
          ) c
),
thatType as (
 SELECT x.xml_id, c.*,
 'thatType' as type
   FROM xml x,
        XMLTABLE('//data'
          PASSING x.data
          COLUMNS
             docNbr PATH '//context/docNumber'
            ,specialValue PATH '//moreData/subData/specialID'
            WHERE XMLEXISTS('$INFO//data/context/thatType'
                 passing x.data as "INFO")
          ) c
)

其思想是在这两个表之间使用UNION ALL,以便其中一个根据出现的子"type“节点选择另一个。

然而,当我尝试以这种方式使用XMLExists时,我在整个SQL中得到了一个“缺少右括号”。

有没有人能告诉我还能尝试些什么?

EN

回答 1

Stack Overflow用户

发布于 2021-01-19 04:42:14

您必须将WHERE子句放在正确的位置。

代码语言:javascript
运行
复制
WITH
   thisType AS ( SELECT x.xml_id,
                        c.*,
                        'thisType' as type
                   FROM xml x,
                        XMLTABLE('//data'
                           PASSING x.data
                           COLUMNS
                              docNbr PATH '//context/docNbr'
                           ) c
                  WHERE XMLEXISTS('$INFO//data/context/thisType'
                        PASSING x.data as "INFO")
               ),
   thatType AS ( SELECT x.xml_id,
                        c.*,
                        'thatType' as type
                   FROM xml x,
                        XMLTABLE('//data'
                           PASSING x.data
                           COLUMNS
                              docNbr PATH '//context/docNbr',
                              specialValue PATH '//moreData/subData/specialID'
                           ) c
                  WHERE XMLEXISTS('$INFO//data/context/thatType'
                        PASSING x.data as "INFO")
               )
SELECT xml_id,
       type,
       docNbr,
       NULL AS specialValue
  FROM thisType
UNION ALL
SELECT xml_id,
       type,
       docNbr,
       specialValue
  FROM thatType;

但在我看来,它可以更简单:

代码语言:javascript
运行
复制
SELECT x.xml_id,
       c.*,
       COALESCE(thisType, thatType) as type
  FROM xml x,
       XMLTABLE('//data'
          PASSING x.data
          COLUMNS
             docNbr PATH '//context/docNbr',
             thisType PATH '//context/thisType',
             thatType PATH '//context/thatType',
             specialValue PATH '//moreData/subData/specialID'
          ) c

此外,我还建议您更好地命名列和别名。特别是,不要使用Oracle关键字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65242901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档