如何将json数组解析成postgresql数组类型?

q5iwbnjs  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(2)|浏览(170)

数组在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[]数组类型列?

yftpprvb

yftpprvb1#

你可以使用json_arrray_elements_text来迭代数组,然后将它聚合回一个数组:

SELECT array_agg(value)
FROM json_array_elements_text(
  ('{"problems": ["/problems/22", "/problems/31"]}'::json)->'problems'
);

如果json值来自一个关系,你可以在子查询中这样做。
但是,如果你的JSON对象包含一个已经与X目标表具有相同形状的属性,有一个更简单的方法-使用json_populate_record

SELECT *
FROM json_populate_record(NULL::X, '{"problems": ["/problems/22", "/problems/31"]}'::json);

online demo

zc0qhyus

zc0qhyus2#

如果我理解正确的话,你需要用json元素 problems 来填充列problems,如果你想要的话,那么使用json_array_elements_text结合ARRAY将json数组转换为文本值列表TEXT[]

update mytable t
set problems = (SELECT ARRAY(SELECT json_array_elements_text(t.items->'problems')))

Demo here

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}|

相关问题