如何在postgresql中查询XML列?

i5desfxk  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(141)

最近我使用的Oracle数据库被迁移到PostgreSQL 12.8。但是我似乎不明白如何在postgresql中查询XML字段。
XML字段:

<abap version="1.0">
    <values>
        <ARCHIVE_INDEX>
            <FUNCTION>DARA</FUNCTION>
            <MANDANT>400</MANDANT>
            <DEL_DATE>0000-00-00</DEL_DATE>
            <SAP_OBJECT>PRINTDOC</SAP_OBJECT>
            <AR_OBJECT>ISU_BILL</AR_OBJECT>
            <OBJECT_ID>600030023597</OBJECT_ID>
            <RESERVE>COMMIT</RESERVE>
        </ARCHIVE_INDEX>
    </values>
</abap>

**在Oracle上:*查询:SELECT EXTRACTVALUE(b.XML, '//ARCHIVE_INDEX/OBJECT_ID') AS OBJECT_ID FROM table_name b * 结果: OBJECT_ID 600030023597
**PostgreSQL上:**查询:SELECT xpath('//ARCHIVE_INDEX/OBJECT_ID', b.XML::xml) AS OBJECT_ID FROM table_name b

  • 结果:* OBJECT_ID {[XML]}

我正试图得到与甲骨文之前的结果相匹配的结果。

gtlvzcf8

gtlvzcf81#

它几乎在评论中回答,但为了完整起见,这里有一个例子:
拥有

create table public.sample1 (
    id int4 not null,
    xml_content xml null
);

insert into sample1 values (1, 
'<abap version="1.0">
    <values>
        <ARCHIVE_INDEX>
            <FUNCTION>DARA</FUNCTION>
            <MANDANT>400</MANDANT>
            <DEL_DATE>0000-00-00</DEL_DATE>
            <SAP_OBJECT>PRINTDOC</SAP_OBJECT>
            <AR_OBJECT>ISU_BILL</AR_OBJECT>
            <OBJECT_ID>600030023597</OBJECT_ID>
            <RESERVE>COMMIT</RESERVE>
        </ARCHIVE_INDEX>
    </values>
</abap>
');

然后,

select (xpath('//ARCHIVE_INDEX/OBJECT_ID/text()'
, xml_content))[1]::text::bigint object_id from sample1;

其中xpath函数的返回值是基于xml数组1的,之后是一对类型转换。
工作样品和official docs

相关问题