sql - Oracle SQL 从多个元素中提取值

标签 sql oracle plsql xml-parsing oracle-xml-db

我花了几天时间寻找以下问题的简单解决方案,我需要一些帮助。我有一个包含两列的 Oracle 表,recid(帐号)作为主键,xmlrecord 存储所有 xml 数据。我正在尝试使用 SQL 查询导出应用程序中具有多值项目的值。排除数据损坏,如果存在 c1 m="1",则始终会存在相应的 c2 m="1"和 c3 m="1",依此类推。该表太大,无法多次点击它来提取每个项目,因此我需要在一次访问该行时将它们全部从 xmlrecord 中提取出来。我尝试过内部联接 (1=1) 和 xmltables,但返回的数据或新行上的每个新匹配项总是以 NULL 结束。由于 xml 的结构,在这种情况下从顶层提取值对我不起作用

我们的基表数据结构:

RECID             XMLRECORD
-----------------------------------
0000001           <row><c1>test</c1><c2>test2</c2>....</row>
0000002           <row><c1>test</c1><c2>test2</c2>....</row>

上述记录可以正常工作,因为没有多值字段。我遇到困难的是 XMLRecord 中存储的数据如下所示:

<row>
  <c1>test1</c1>
  <c1 m=1>test1_2</c1>
  <c2>test2</c2>
  <c2 m=1>test2_2</c2>
  <c3>test3</c3>
  <c3 m=1>test3_2</c3>
</row>

我想要的输出格式如下:

RECID       Col1     Col2     Col3
-----------------------------------
0000003     test1    test2    test3
0000003     test1_2  test2_2  test3_2
0000004     test1    test2    test3
0000004     test1_2  test2_2  test3_2   

最佳答案

谢谢大家的评论,但我已经通过构建适用于该实例的联接设法获得了我需要的解决方案。它的好处是,无论供应商向我们扔了多少记录,它都会起作用。在某些情况下,“m”属性最多可达 9 或 10。

我在 (1=1) 上使用了通常的内部联接,并基于动态 ID 构建了后续联接。 第一行的 ID_NUM 结果是“c”,下一行是“c2”,依此类推。

SELECT 
    t.recid
    ,t2.VALUE1 
    ,t3.VALUE2 
    ,t4.VALUE3 
FROM t
INNER JOIN XMLTABLE('/row/c1'
    PASSING t.xmlrecord
    ID_NUM VARCHAR(4) path 'concat(substring(ancestor-or-self::*/name(.),1,1), @m)',
    VALUE1 VARCHAR(20) path '.') t2
ON (1=1)
INNER JOIN XMLTABLE('/row/c2'
    PASSING t.xmlrecord
    ID_NUM VARCHAR(4) path 'concat(substring(ancestor-or-self::*/name(.),1,1), @m)',
    VALUE2 VARCHAR(20) path '.') t3
ON (t2.ID_NUM=t3.ID_NUM)
INNER JOIN XMLTABLE('/row/c3'
    PASSING t.xmlrecord
    ID_NUM VARCHAR(4) path 'concat(substring(ancestor-or-self::*/name(.),1,1), @m)',
    VALUE3 VARCHAR(20) path '.') t4
ON (t2.ID_NUM=t4.ID_NUM)

关于sql - Oracle SQL 从多个元素中提取值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21218510/

相关文章:

sql - 甲骨文 :Compare dates only by the Hour

oracle - Oracle (PL/)SQL 中的字符串格式化

sql - 子查询连接和 where 中的差异可见性

sql - 将两个结果合并到一个表中

sql - Oracle SQL - 检查 sql 数据大小

oracle - 用于 PL/SQL 开发的免费软件工具

performance - Oracle 10g 小 Blob 或 Clob 没有被内联存储?

database - 使用 :new and :old referencing different tables in SQL

sql - SELECT 中但在一个 View 上有多个 SUM

php - 如何在一个 mysql_query 中执行多个 SQL 语句?