xml - Postgres JSONb 包括数组到 XML 与键和值和值
问题描述
我有一个如下表:
id (VARCHAR) | field1 (text) | attributes (jsonb)
--------------+---------------+----------------------------------
123 | a | {"age": "1", "place": "TX"}
456 | b | {"age": "2", "name": "abcdef"}
789 | |
098 | c | {"name": ["abc", "def", "ghi"]}
想将其转换为:
<Company id="123" field="a">
<CompanyTag tagName="age" tagValue="1"/>
<CompanyTag tagName="place" tagValue="TX"/>
</Company>
<Company id="456" field="b">
<CompanyTag tagName="age" tagValue="2"/>
<CompanyTag tagName="name" tagValue="abcdef"/>
</Company>
<Company id="789"/>
<Company id="098" field="c">
<CompanyTag tagName="name" tagValue="abc"/>
<CompanyTag tagName="name" tagValue="def"/>
<CompanyTag tagName="name" tagValue="ghi"/>
</Company>
在Post下的 @bergi 和 @Georges Martin 的帮助下,能够使用以下查询转换非数组:
SELECT XMLELEMENT(
NAME "Company",
XMLATTRIBUTES(id AS id, field1 AS field),
(SELECT XMLAGG(
XMLELEMENT(
NAME "companyTag",
XMLATTRIBUTES(
attr.key AS "tagName",
attr.value AS "tagValue"
)
)
) FROM JSONB_EACH_TEXT(attributes) AS attr)
) FROM comp_emp;
但是数组值显示如下:
<Company id="098" field="c">
<CompanyTag tagName="name"tagValue="["abc", "def", "ghi"]"/>
我不想在查询中特别提及键(“tagName”),因为这可能会有所不同。假设这是由于 JSONB_EACH_TEXT 提取最外层值引起的。有替代方案吗?
请指导我正确的方向。
解决方案
推荐阅读
- java - app:passwordToggleEnabled="true" 不起作用
- javascript - 单击后取消对 Boostrap 5 切换按钮的关注
- python - 'float' 对象在 for 循环中不可迭代
- java - Spring Boot 中的处理程序方法正在保存新记录,而不是更新数据库中已存在的记录以进行 put 请求
- python - 如何在不自动重新启动的情况下停止 Google Colab 运行时
- android - 与 CCID HID 阅读器通信时如何构造正确的 PC_to_RDR_IccPowerOn
- javascript - React-native-gifted-chat 图像未显示
- docker - 本地运行的 Dockerfile 有谷歌云 SDK,生产中的相同 Dockerfile 没有
- sql - 函数中不存在 Postgresql 参数
- python - 在 PyCharm 中导入 .json 文件时出现问题