【问题标题】:Parent xml in sql query, xpathsql查询中的父xml,xpath
【发布时间】:2017-03-06 06:35:54
【问题描述】:

我得到了这样的xml:

< person code="SNIPER">

    <type code="SINGLE" />

<version code="1" dateFrom="2015-03-20" />
</version>

<version code="2" dateFrom="2012-06-15" />
</version>

 < /person>

我有sql查询:

select extract(VALUE(cd_xml), 'version/@code').getstringval() code
       ,cast(to_timestamp_tz(replace(extract(VALUE(cd_xml), 'version/@dateFrom')
                                                   .getstringval(), 'T', ''),
                                           'yyyy-mm-dd') as date) datefrom

from table(xmlsequence(extract(get_xml, '/*/person/version'))) cd_xml

它返回两行:

1  2015-03-10

2  2012-06-15

我想获得这样的行:

single 1  2015-03-10

single 2  2012-06-15

sniper 1  2015-03-10

sniper 2  2012-06-15

怎么做?? 我用父子句尝试了不同的事情,但我没有做到:(

【问题讨论】:

  • 你如何决定你想要“单身”还是“狙击手”?此外,您的 XML 有 version 节点,这些节点既是自关闭的,又带有明确的关闭标签,这使得它无效;并且您的 XPath 需要一个节点 above person。您可以编辑问题以使其保持一致吗?
  • 我简化了问题。我得到了xml,这样的xml很少。问题是我需要带有“单”的行。但是如果我以某种方式收到带有狙击手的行,我可以进行另一个查询以将“狙击手”与“单人”连接起来

标签: xml oracle xpath


【解决方案1】:

The extract function is deprecated;您可以为此使用它,但最好使用XMLQuery/XMLTable,例如假设 get_xml 是一个函数,它以 XMLType 的形式返回格式正确的 XML:

select *
from xmltable('/persons/person/version'
  passing get_xml
  columns person_code varchar2(10) path './../@code',
    type_code varchar2(10) path './../type/@code',
    version_code number path '@code',
    version_datefrom date path '@dateFrom'
);

使用静态 XML 的演示,根据您发布的内容进行修改以匹配您使用的模式:

select *
from xmltable('/persons/person/version'
  passing xmltype('<persons>
  <person code="SNIPER">
    <type code="SINGLE" />
    <version code="1" dateFrom="2015-03-20" />
    <version code="2" dateFrom="2012-06-15" />
  </person>
</persons>')
  columns person_code varchar2(10) path './../@code',
    type_code varchar2(10) path './../type/@code',
    version_code number path '@code',
    version_datefrom date path '@dateFrom'
);

PERSON_COD TYPE_CODE  VERSION_CODE VERSION_DA
---------- ---------- ------------ ----------
SNIPER     SINGLE                1 2015-03-20
SNIPER     SINGLE                2 2012-06-15

您的操作表明dateFrom 确实是一个完整的时间戳,更像'2015-03-20T12:34:56+04:00';如果您只想要其中的日期部分,您也可以更简单地获得它,将列提取为timestamp with time zone,然后在最后进行转换:

select person_code, type_code, version_code,
  cast(version_datefrom as date) as version_datefrom
from xmltable('/persons/person/version'
  passing xmltype('<persons>
  <person code="SNIPER">
    <type code="SINGLE" />
    <version code="1" dateFrom="2015-03-20T12:34:56+04:00" />
    <version code="2" dateFrom="2012-06-15T23:00:00+00:00" />
  </person>
</persons>')
  columns person_code varchar2(10) path './../@code',
    type_code varchar2(10) path './../type/@code',
    version_code number path '@code',
    version_datefrom timestamp with time zone path '@dateFrom'
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-16
    相关资源
    最近更新 更多