You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle中如何从单个xmltype标签提取值拆分到不同列

问题原因

你当前使用的extract函数匹配到单条XML中多个<LOCATION>节点时,getStringVal()会自动将所有匹配到的TYPE属性值拼接返回,因此会出现ABSABSREL这类合并结果。


方案1:拆分为独立行(节点数量不固定时推荐)

使用Oracle自带的XMLTable函数拆分每个<LOCATION>节点,每个节点生成单独的行记录,同时还可同步提取其他属性/坐标值,适合后续存入表中:

SELECT 
    a.object_id,
    x.location_type AS "Location Type",
    x.epsg AS "EPSG编码",
    x.x_val AS "坐标X",
    x.y_val AS "坐标Y"
FROM 
    object_history a,
    XMLTable(
        '//LOCATION' 
        PASSING a.xml_data
        COLUMNS 
            location_type VARCHAR2(10) PATH '@TYPE',
            epsg VARCHAR2(10) PATH '@EPSG',
            x_val NUMBER PATH 'X',
            y_val NUMBER PATH 'Y'
    ) x;

如果需要直接存入新表,在查询前加CREATE TABLE 你的新表名 AS即可。


方案2:拆分为固定独立列(节点数量固定时使用)

如果明确知道单条XML中最多有N个<LOCATION>节点,可以指定节点位置分别提取到独立列:

SELECT 
    a.object_id,
    a.xml_data.extract('//LOCATION[1]/@TYPE').getStringVal() AS "Location Type 1",
    a.xml_data.extract('//LOCATION[2]/@TYPE').getStringVal() AS "Location Type 2",
    a.xml_data.extract('//LOCATION[3]/@TYPE').getStringVal() AS "Location Type 3"
    -- 有更多节点继续按序号加即可
FROM 
    object_history a;

如果要写入原表的新增列,先执行ALTER TABLE给object_history加对应字段,再用上述查询结果做UPDATE批量赋值即可。


内容的提问来源于stack exchange,提问作者ANCHAL BHASIN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 08:06:05