【问题标题】:How to extract values from a single xmltype tag into different columns in oracle?如何将单个 xmltype 标记中的值提取到 oracle 中的不同列中?
【发布时间】:2021-09-28 04:56:14
【问题描述】:

我在一个包含以下标签的表中有一个 xmltype 列

<LOCATION TYPE="ABS" EPSG="4277" UNIT="decLL">
      <X>-2.12105834</X>
      <Y>49.20372223</Y>
    </LOCATION>

我已使用以下查询提取列中类型的值

SELECT a.object_id,a.xml_data.extract('//LOCATION/@TYPE').getStringVal() AS "Location Type"
FROM   object_history a;

输出是表中单列中的 ABSABSREL。 我想在表格的单独列中获取每个值。 请帮忙看看如何做到这一点?

【问题讨论】:

  • 否,这些值已正确提取,但我希望它们出现在单独的列中
  • 您提供的示例无法返回这样的值,因为看起来您有更多具有相同标签的条目并且 xpath 返回一个序列。如果您知道其中的最大元素数,您可以按位置访问它们([n]),如果不知道,那么 Oracle 中的 SQL 结果集不可能有预定义的结构
  • 我尝试将类型后的索引作为类型[1],但它仍然返回多个值
  • 请提供可重现的示例以及适当的样本数据及其输出

标签: sql oracle xmltype


【解决方案1】:

使用XMLTABLE:

SELECT object_id,
       x.*
FROM   object_history h
       CROSS APPLY XMLTABLE(
         '/LOCATION'
         PASSING h.xml_data
         COLUMNS
           type VARCHAR2(3)  PATH './@TYPE',
           epsg NUMBER       PATH './@EPSG',
           unit VARCHAR2(10) PATH './@UNIT',
           x    NUMBER       PATH './X',
           y    NUMBER       PATH './Y'
       ) x

其中,对于样本数据:

CREATE TABLE object_history ( object_id, xml_data ) AS
SELECT 1, XMLTYPE('<LOCATION TYPE="ABS" EPSG="4277" UNIT="decLL"><X>-2</X><Y>49</Y></LOCATION>') FROM DUAL UNION ALL
SELECT 2, XMLTYPE('<LOCATION TYPE="ABS" EPSG="4277" UNIT="decLL"><X>-1</X><Y>50</Y></LOCATION>') FROM DUAL UNION ALL
SELECT 3, XMLTYPE('<LOCATION TYPE="REL" EPSG="4277" UNIT="decLL"><X>0</X><Y>51</Y></LOCATION>') FROM DUAL;

输出:

OBJECT_ID TYPE EPSG UNIT X Y
1 ABS 4277 decLL -2 49
2 ABS 4277 decLL -1 50
3 REL 4277 decLL 0 51

db小提琴here

【讨论】:

    猜你喜欢
    • 2013-07-06
    • 1970-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2021-12-21
    • 1970-01-01
    相关资源
    最近更新 更多