Postgres JSONb,包括到XML的数组,带有键、值和值
我的表格如下:Postgres JSONb,包括到XML的数组,带有键、值和值,xml,postgresql,Xml,Postgresql,我的表格如下: id (VARCHAR) | field1 (text) | attributes (jsonb) --------------+---------------+---------------------------------- 123 | a | {"age": "1", "place": "TX"}
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="098" field="c">
<CompanyTag tagName="name"tagValue="["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>
但是,数组值显示如下:
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="098" field="c">
<CompanyTag tagName="name"tagValue="["abc", "def", "ghi"]"/>
我不想在查询中特别提到键(“标记名”),因为这可能会有所不同。假设这是由于JSONB_每个_文本提取最外面的值引起的。还有别的选择吗
请指导我正确的方向。如果要处理数组,您需要额外的
jsonb_array_elements_text
提取值。通过横向连接完成:
SELECT XMLAGG(
XMLELEMENT(
NAME "CompanyTag",
XMLATTRIBUTES(
attr.key AS "tagName",
values.element AS "tagValue"
)
)
) FROM jsonb_each(attributes) AS attr,
LATERAL jsonb_array_elements_text(CASE jsonb_typeof(attr.value)
WHEN 'array' THEN attr.value
ELSE jsonb_build_array(attr.value)
END) AS values(element)
(,带有完整的查询)Ah,谢谢您的示例。起初我担心你会得到
,我想这是不可能的。重复的
s很容易。@AArun很高兴能帮上忙!你可能想再次接受答案。