如何从 JSON 中提取重复多次的值?
How to extract a value from JSON that repeats multiple times?
我有以下 table:
我需要创建一个 select 让我 returns 像这样的东西:
我试过这个代码:
SELECT Code, json_extract_path(Registers::json,'sales', 'name')
FROM tbl_registers
前面的代码 returns 我在 json_extract_path 中输入了一个 NULL,我已经尝试过运算符 ::json->'sales'->>'name'
,但也不起作用。
您需要取消嵌套数组,然后将名称聚合回来。这可以使用 json_array_elements
和标量子查询来完成:
select code,
(select string_agg(e ->> 'name', ',')
from json_array_elements(t.products) as x(e)) as products
from tbl_registers t;
我还强烈建议将您的专栏类型更改为 jsonb
SELECT
code,
string_agg( -- 3
elems ->> 'name', -- 2
','
) as products
FROM tbl_registers,
json_array_elements(products::json) as elems -- 1
GROUP BY code
- 如果你有文本类型(严格不推荐,请使用适当的数据类型
json
或jsonb
),那么你需要将它转换为类型json
(我猜你有类型文本,因为您已经在示例代码中进行了转换)。之后,您需要将数组元素提取到每个元素一行
- 获取
name
值
- 通过分组重新聚合并使用
string_agg()
创建字符串列表
我有以下 table:
我需要创建一个 select 让我 returns 像这样的东西:
我试过这个代码:
SELECT Code, json_extract_path(Registers::json,'sales', 'name')
FROM tbl_registers
前面的代码 returns 我在 json_extract_path 中输入了一个 NULL,我已经尝试过运算符 ::json->'sales'->>'name'
,但也不起作用。
您需要取消嵌套数组,然后将名称聚合回来。这可以使用 json_array_elements
和标量子查询来完成:
select code,
(select string_agg(e ->> 'name', ',')
from json_array_elements(t.products) as x(e)) as products
from tbl_registers t;
我还强烈建议将您的专栏类型更改为 jsonb
SELECT
code,
string_agg( -- 3
elems ->> 'name', -- 2
','
) as products
FROM tbl_registers,
json_array_elements(products::json) as elems -- 1
GROUP BY code
- 如果你有文本类型(严格不推荐,请使用适当的数据类型
json
或jsonb
),那么你需要将它转换为类型json
(我猜你有类型文本,因为您已经在示例代码中进行了转换)。之后,您需要将数组元素提取到每个元素一行 - 获取
name
值 - 通过分组重新聚合并使用
string_agg()
创建字符串列表