【问题标题】:Replace Particular XML tag with NULL value in Oracle SQL在 Oracle SQL 中用 NULL 值替换特定的 XML 标记
【发布时间】:2017-11-02 06:21:55
【问题描述】:

我在 XMLTYPE 类型的 DUMMY 表中有列作为 VALUE。 它包含:

  <?xml version="1.0"?>
  <ROWSET>
  <Value>
    <Data>802
     </Data>
  </Value>
  <Value>
    <Data>902
      </Data>
    </Value>
  </ROWSET>

对于 802 值标签,我需要将其替换为 NULL。 输出应该是:

  <?xml version="1.0"?>
   <ROWSET>
  <Value>
    <Data>902
     </Data>
  </Value>
  </ROWSET>

802 值标签应该用 NULL 删除。

我试过 UpdateXML():

  update Dummy set VALUE=updatexml(VALUE,'ROWSET/Value/Data/text()','');

但它只会用 null 更新 802 值。

第二种方法: update Dummy set Value=updatexml(Value,'ROWSET','');

但它会删除 ROWSET 标签内的所有内容。然后,它将只包含:

<?xml version="1.0"?>
<ROWSET/>

我也试过 Replace()。

     update Dummy set emps=replace('
      <Value><Data>802
      </Data></Value>',null);

然后它将从 VALUE 列中删除其他值,并仅保留 replace() 中提到的标记。

在这个replace()之后,它包含:

  <Value><Data>802
  </Data></Value>

请在这方面给我建议。

【问题讨论】:

    标签: replace plsql updatexml


    【解决方案1】:

    你需要

    • deleteXml() 而不是 updateXml(),并且
    • 要删除的内容的正确 XPath。

    让我们先测试一下我们的 XPath

    with input$ as (
        select --+ no_merge
            xmltype(q'{<?xml version="1.0"?>
          <ROWSET>
          <Value>
            <Data>802
             </Data>
          </Value>
          <Value>
            <Data>902
              </Data>
            </Value>
          </ROWSET>}') as xx
        from dual
    )
    select
        xmlserialize(document X.xx indent) as original,
        xmlserialize(document
            deletexml(X.xx, '/ROWSET/Value[normalize-space(Data)="802"]')
            indent
        ) as with_802_removed
    from input$ X;
    

    ...产生...

    ORIGINAL               WITH_802_REMOVED
    ---------------------- ----------------------
    <?xml version="1.0"?>  <?xml version="1.0"?>
    <ROWSET>               <ROWSET>
      <Value>                <Value>
        <Data>802              <Data>902
             </Data>                 </Data>
      </Value>               </Value>
      <Value>              </ROWSET>
        <Data>902                                                                    
              </Data>                                                                
      </Value>                                                                       
    </ROWSET>                                                                        
    

    注意:xmlserialize() 函数在这里仅用于漂亮的打印。

    现在更新

    update Dummy X
    set X.value = deletexml(X.value, '/ROWSET/Value[normalize-space(Data)="802"]');
    

    Oracle 12c 注释: 使用 XQuery 应该有一个更优雅的解决方案,但我还不能完全掌握 XQuery 语言,因此我向您介绍 @987654327仅限@解决方案。

    【讨论】:

    • 谢谢。它帮助很大。
    猜你喜欢
    • 2018-09-08
    • 2016-04-07
    • 2011-01-07
    • 2023-03-28
    • 2019-01-09
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2013-11-19
    相关资源
    最近更新 更多