6

在 SQL Server 2005 的 T-SQL 语言中,我可以通过以下方式分解 XML 值:

SELECT
    t.c.value('./ID[1]', 'INT'),
    t.c.value('./Name[1]', 'VARCHAR(50)')
FROM @Xml.nodes('/Customer') AS t(c)

其中@Xml 是一个类似的xml值

'<Customer><ID>23</ID><Name>Google</Name></Customer>'

有人可以帮助我在 PostgreSQL 中(可能在 PL/pgSQL 中)实现相同的结果吗?

4

2 回答 2

11

xpath函数将返回一个节点数组,以便您可以提取多个伙伴。通常,您会执行以下操作:

SELECT (xpath('/Customer/ID/text()', node))[1]::text::int AS id,
  (xpath('/Customer/Name/text()', node))[1]::text AS name,
  (xpath('/Customer/Partners/ID/text()', node))::_text AS partners
FROM unnest(xpath('/Customers/Customer',
'<Customers><Customer><ID>23</ID><Name>Google</Name>
 <Partners><ID>120</ID><ID>243</ID><ID>245</ID></Partners>
</Customer>
<Customer><ID>24</ID><Name>HP</Name><Partners><ID>44</ID></Partners></Customer>
<Customer><ID>25</ID><Name>IBM</Name></Customer></Customers>'::xml
)) node

您用来unnest(xpath(...))将一大块 xml 分成行大小的小块的地方;并xpath()提取单个值。从 XML 数组中提取第一个值、转换为text然后转换为int(或datenumeric)并不是很舒服。我的博客上有一些辅助函数可以让这更容易,请参阅Postgres 中的 XML 解析

于 2010-09-08T05:22:45.097 回答
7

使用PostgreSQL中的 xpath 函数来处理 XML。

编辑:示例:

SELECT
    xpath('/Customer/ID[1]/text()', content),
    xpath('/Customer/Name[1]/text()', content),
    *
FROM
    (SELECT '<Customer><ID>23</ID><Name>Google</Name></Customer>'::xml AS content) AS sub;
于 2010-09-06T10:09:36.700 回答