在PostgreSQL中从JSON数组创建XML
我有一个包含如下数据的列的表:n个json元素的数组在PostgreSQL中从JSON数组创建XML,json,postgresql,Json,Postgresql,我有一个包含如下数据的列的表:n个json元素的数组 [ {"ref":"3455","desc":"My Product 1","price":"4","quant":"90"}, {"ref":"3455","desc":"My Product 2","price":"5","quant":"80"} ] 我需要解析/迭代每个JSON元素。在这个例子中,我有2个。结果将是一个自定义字符串(实际上是XML字符串) 预期的XML结果: 3455 我的产品1 4. 90 3455 我的
[
{"ref":"3455","desc":"My Product 1","price":"4","quant":"90"},
{"ref":"3455","desc":"My Product 2","price":"5","quant":"80"}
]
我需要解析/迭代每个JSON元素。在这个例子中,我有2个。结果将是一个自定义字符串(实际上是XML字符串)
预期的XML结果:
3455
我的产品1
4.
90
3455
我的产品2
5.
80
实现这一目标的最佳方式是什么
谢谢大家! 在我的解决方案中,我假设JSON数组中的对象具有相同的结构。因此,我们为该对象创建一个SQL
类型
:
DROP TYPE(如果存在项目类型);
创建类型项\u类型
AS(“ref”int,“desc”VARCHAR(500),价格浮动,数量整数);
--ref和desc是SQL关键字
--因此,您需要指定它们实际上是列名
演示表如下所示:
CREATE TABLE items
(
id SERIAL NOT NULL
CONSTRAINT items_pkey
PRIMARY KEY,
content jsonb DEFAULT '[]'::jsonb NOT NULL
);
查询:
SELECT xmlelement(name items, (--create the root element "items"
SELECT xmlagg(--aggregate "item" elements
xmlelement(NAME item, --create "item" elements
xmlforest(t."ref", t."desc", t.price, t.quant)--create "item" element content
)
)
FROM
(
SELECT (jsonb_populate_recordset(NULL :: item_type, items.content)).*--create records ot of JSON array
FROM items
WHERE items.id = 1 --you can remove where if you want all rows
) AS t
))
说明:由内而外;(1) 创建我们先前创建的类型的SQL记录 (JSON数组中的
项类型
)使用,(2)使用创建
节点的内容,(3)使用创建
元素本身,(4)使用聚合
元素,使用xmlelement
创建根元素
-它运行,但看起来SQLFIDLE在输出XML结果时遇到问题,因此我将结果转换为
文本在我的解决方案中,我假定JSON数组中的对象具有相同的结构。因此,我们为该对象创建一个SQL类型
:
DROP TYPE(如果存在项目类型);
创建类型项\u类型
AS(“ref”int,“desc”VARCHAR(500),价格浮动,数量整数);
--ref和desc是SQL关键字
--因此,您需要指定它们实际上是列名
演示表如下所示:
CREATE TABLE items
(
id SERIAL NOT NULL
CONSTRAINT items_pkey
PRIMARY KEY,
content jsonb DEFAULT '[]'::jsonb NOT NULL
);
查询:
SELECT xmlelement(name items, (--create the root element "items"
SELECT xmlagg(--aggregate "item" elements
xmlelement(NAME item, --create "item" elements
xmlforest(t."ref", t."desc", t.price, t.quant)--create "item" element content
)
)
FROM
(
SELECT (jsonb_populate_recordset(NULL :: item_type, items.content)).*--create records ot of JSON array
FROM items
WHERE items.id = 1 --you can remove where if you want all rows
) AS t
))
说明:
由内而外;(1) 创建我们先前创建的类型的SQL记录
(JSON数组中的项类型
)使用,(2)使用创建
节点的内容,(3)使用创建
元素本身,(4)使用聚合
元素,使用xmlelement
创建根元素
-它正在运行,但看起来SQLFIDLE在输出XML结果时遇到问题,因此我将结果转换为文本请回答您的问题,并根据示例数据添加预期的输出。请注意,Postgres中没有专门的工具来将json转换为xml。我认为这种转换在客户端应用程序中可能非常容易。用您喜爱的语言搜索解决方案,例如,请回答您的问题,并根据您的样本数据添加预期输出。请注意,Postgres中没有专门的工具来将json转换为xml。我认为这种转换在客户端应用程序中可能非常容易。用您喜爱的语言搜索解决方案,例如@user3643038如果答案对您有帮助,请接受并向上投票。@user3643038如果答案对您有帮助,请接受并向上投票。