提问人:Roland 提问时间:6/9/2023 最后编辑:Roland 更新时间:6/10/2023 访问量:93
如何将JSON数组解析为PostgreSQL数组类型?
how to parse json array into postgresql array type?
问:
数组在PostgreSQL中看起来非常简单,但是我在将JSON解析为数组列类型时遇到了问题。
Json 数据包含一个具有数组值的属性:
"problems": ["/problems/22", "/problems/31"],
该表有一个数组类型的列,如下所示:
CREATE TABLE X(
problems TEXT[],
...
);
解析通常有效,例如:
t.items->>'problems' --ok
返回:
["/problems/22", "/problems/31"]
然后我尝试了这个不起作用:
t.items->>'problems'::text[] --error, malformed
然后我在 json 中将 [] 替换为 {} 以遵循 PostgreSQL 数组语法:
replace(replace(t.items->>'problems', '[', '{'), ']', '}')::text[] --ok
虽然这是“可行的”,但我觉得这是一个笨拙的问题。无论如何,这是丑陋的,而且不是PostgreSQL其他优雅方式的风格。
如何正确将JSON解析为TEXT[]数组类型列?
答:
1赞
SelVazi
6/9/2023
#1
如果我理解正确,您需要通过 json 元素问题来填充列问题,如果这是您想要的,那么结合使用将 json 数组转换为文本值列表json_array_elements_text
ARRAY
TEXT[]
update mytable t
set problems = (SELECT ARRAY(SELECT json_array_elements_text(t.items->'problems')))
select
(SELECT ARRAY(
SELECT json_array_elements_text(t.items->'problems')
))::text[] problems
from (
select '{"problems": ["/problems/22", "/problems/31"]}'::json items
) t
输出:
problems |
---------------------------+
{/problems/22,/problems/31}|
评论
1赞
Roland
6/10/2023
对不起,我在答案中添加了小提琴,但你的小提琴正是我想要的。通过稍微格式化它,我使文本布局更窄,以便在没有水平滚动条的情况下更易于阅读,也使我更容易理解
0赞
SelVazi
6/10/2023
很高兴听到并感谢您的编辑:)
2赞
Bergi
6/9/2023
#2
您可以使用 json_arrray_elements_text
迭代数组,然后将其聚合回数组:
SELECT array_agg(value)
FROM json_array_elements_text(
('{"problems": ["/problems/22", "/problems/31"]}'::json)->'problems'
);
如果 json 值来自关系,则可以在子查询中执行此操作。
但是,如果您的 JSON 对象包含的属性已经与目标表具有相同的形状,则有一种更简单的方法 - 请使用json_populate_record
:X
SELECT *
FROM json_populate_record(NULL::X, '{"problems": ["/problems/22", "/problems/31"]}'::json);
(在线演示)
评论
0赞
Roland
6/10/2023
我觉得你的答案很有用,总有一天我会明白的,我发现这个json / sql问题很复杂。另一个答案我可以直接应用于我的项目,但你的答案当然也很有用。谢谢。
下一个:json 提取中缺少字段
评论
-->
->>