我有一个表,其中包含一个包含如下数据的列: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结果:
<items>
<item>
<ref>3455</ref>
<desc>My Product 1</desc>
<price>4</price>
<quant>90</quant>
</item>
<item>
<ref>3455</ref>
<desc>My Product 2</desc>
<price>5</price>
<quant>80</quant>
</item>
</items>
实现这一目标的最佳方法是什么?
谢谢你!答案 0 :(得分:0)
在我的解决方案中,我假设JSON数组中的对象具有相同的结构。因此,我们为这些对象创建了一个SQL type
:
DROP TYPE IF EXISTS item_type;
CREATE TYPE item_type
AS ("ref" int, "desc" VARCHAR(500), price FLOAT, quant INTEGER);
--ref and desc are SQL key words
--so you need to specify that they actually are column names
演示表如下所示:
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记录
(item_type
)使用jsonb_populate_recordset
从JSON数组中取出,{2}使用xmlforest
创建<item>
个节点的内容,(3)创建<item>
}元素本身使用xmlelement
,(4)使用xmlagg
汇总<item>
元素,使用<items>
创建根元素xmlelement
。
SQLFiddle - 它运行但看起来SQLFiddle在输出XML结果时出现问题,因此我将结果转换为TEXT
。