首页 > 解决方案 > 列中的 XML 数据类型以查找现有值

问题描述

我在查找数据类型为 XMLType 的表中的行时遇到问题,我正在寻找名称“PrimeSub”和值“Y”。谢谢

<attributes>  
  <upper_lvl_ver_desc>
    <Name>AABB</Name>
    <Description>pkListValue</Description>
    <Value/>
  </upper_lvl_ver_desc>
  <upper_lvl_ver_desc>
    <Name>GL_PS_ALLOWED</Name>
    <Description>pkListValue</Description>
    <Value/>
  </upper_lvl_ver_desc>
  <upper_lvl_ver_desc>
    <Name>PrimeSub</Name>
    <Description>pkListValue</Description>
    <Value>Y</Value>
  </upper_lvl_ver_desc>
</attributes>

标签: oracle

解决方案


你没有发布你的表名或结构,所以我在这里使用mytable作为表名和xmlcolxmltype 列。顶部的 WITH 子句只是提供测试数据。

with mytable as (select xmltype('<attributes>  
  <upper_lvl_ver_desc>
    <Name>AABB</Name>
    <Description>pkListValue</Description>
    <Value/>
  </upper_lvl_ver_desc>
  <upper_lvl_ver_desc>
    <Name>GL_PS_ALLOWED</Name>
    <Description>pkListValue</Description>
    <Value/>
  </upper_lvl_ver_desc>
  <upper_lvl_ver_desc>
    <Name>PrimeSub</Name>
    <Description>pkListValue</Description>
    <Value>Y</Value>
  </upper_lvl_ver_desc>
</attributes>') as xmlcol from dual)
-- query starts here
select xmlcol
from mytable
inner join XMLTable('/attributes/upper_lvl_ver_desc' PASSING mytable.xmlcol
                COLUMNS c_name varchar2(50) PATH 'Name',
                        c_value varchar2(1) PATH 'Value') atts
on c_name = 'PrimeSub' and c_value = 'Y'
;

这种方法可能看起来有点违反直觉,但这是 Oracle 推荐的一种方法。您使用 XMLTable 函数将 XML 列连接为伪表,将其转换为可以在 SQL 中轻松操作的关系数据。你可以在这里阅读更多关于它的信息


推荐阅读