【问题标题】:Querying an XML-Object in Oracle SQL: getting a value of an attribut by specifying another attribut of the object在 Oracle SQL 中查询 XML-Object:通过指定对象的另一个属性来获取一个属性的值
【发布时间】:2017-08-17 22:23:55
【问题描述】:

我知道这里有很多关于在 Oracle SQL 中查询 XML 对象的条目。但是,我仍然找不到任何关于我的问题的答案。

我有一个 SQL 表 obj,其中包含一些列。 XML 格式的 clob 对象(列称为definition)。

我想从 clob 中提取一个具体的值。

XML 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
    <m>
        <i n="Status">0</i>
        <s n="Description">AmountDifference</s>
        <s n="Name">InputvsOutput</s>
        <a n="Variables">
            <m>
                <s n="Name">Formula</s>
                <s n="Value">B-A</s>
            </m>
            <m>
                <s n="Name">CriticalDiff</s>
                <s n="Value">abs({B} - {A}) &lt; 10</s>
            </m>
        </a>
    </m>

SQL 查询应返回两个值:DescriptionValue,其中 Name = CriticalDiff。

SQL查询部分如下所示:

CAST(
CASE WHEN obj.definition is not null then
       UTL_I18N.UNESCAPE_REFERENCE(
                XMLTYPE(obj.definition).
                EXTRACT('//s[@n="Description"]/text()')
                .getStringVal() )
END as varchar(200)) as "Rule Expression"
, obj.definition as rule_xml

CAST 块工作正常,但我想知道如何以类似的方式转换最后一个命令,以便通过其名称 (= CriticalDiff) 获得一个值。

我面临的困难是有两个相似的元素(m)具有相同的属性名称(名称,值)。

任何想法如何从“CriticalDiff”中获得“价值”属性?

提前致谢!

【问题讨论】:

    标签: sql xml oracle xpath xmltype


    【解决方案1】:

    试试:

    WITH obj AS (
    SELECT q'[<?xml version="1.0" encoding="UTF-8"?>
        <m>
            <i n="Status">0</i>
            <s n="Description">AmountDifference</s>
            <s n="Name">InputvsOutput</s>
            <a n="Variables">
                <m>
                    <s n="Name">Formula</s>
                    <s n="Value">B-A</s>
                </m>
                <m>
                    <s n="Name">CriticalDiff</s>
                    <s n="Value">abs({B} - {A}) &lt; 10</s>
                </m>
            </a>
        </m>]' as definition FROM dual
    ) SELECT 
      XMLTYPE( obj.definition ). 
        EXTRACT('//s[@n="Description"]/text()').getStringVal() as Description,
      XMLTYPE( obj.definition ). 
        EXTRACT('//m/s[@n="Name" and text() = "CriticalDiff"]/text()').getStringVal() as Name,
      UTL_I18N.UNESCAPE_REFERENCE(XMLTYPE( obj.definition ). 
        EXTRACT('//m/s[@n="Name" and text() = "CriticalDiff"]/../s[@n="Value"]/text()').getStringVal()) as Value
    FROM obj;
    

    DESCRIPTION      |NAME         |VALUE               |
    -----------------|-------------|--------------------|
    AmountDifference |CriticalDiff |abs({B} - {A}) < 10 |
    

    另一个版本的 xpath 也可以工作:

     EXTRACT('//m[s[@n="Name" and text() = "CriticalDiff"]]/s[@n="Value"]/text()').getStringVal()) as Value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-28
      • 1970-01-01
      • 1970-01-01
      • 2021-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多