1

我一般是 json 数组的新手,但特别是 postgresql 并正在寻找一些指导 -

我有一张这样的桌子-

indicator    array
1           [["abc","snow"],"abc","rain"]]
2           [["abc","snow"],["efg","snow"],["abc","rain"],["efg","rain"]]

所以,我想根据指标提取出字母。如果为 1 则为“abc”,如果为 2 则为“abc”和“efg”。像这样 -

indicator     array                                                          output
1           [["abc","snow"],"abc","rain"]]                                    abc
2           [["abc","snow"],["efg","snow"],["abc","rain"],["efg","rain"]]     abc,efg

感谢您的任何指导

4

2 回答 2

1

分步演示:db<>fiddle

SELECT
    indicator,
    data,
    string_agg(DISTINCT elem ->> 0, ',')    -- 3
FROM mytable,
    jsonb_array_elements(data) as elem      -- 1
GROUP BY indicator, data                    -- 2
  1. 将所有数组元素提取到自己的记录中
  2. 使用以下聚合重新聚合它们:
  3. a) 获取第一个数组元素作为文本 ( ->> 0) b) 使用删除重复项DISTINCTc) 使用聚合作为字符串列表string_agg()
于 2021-02-02T15:48:42.690 回答
0

评论中的答案有助于理解小提琴及其在那里的工作原理,谢谢!但是,它不适用于我的用例,所以我把它放在一起,最终为我解决了这个问题。也许更迂回一点,但工作正常。

用于将 JSON 数组列拆分为 2:

select indicator,data 
split_part(replace(replace(replace(json_format(cast(array_agg(DISTINCT id as JSON)), '[', ''), ']', ''), '"', ''),',',1)  as id_1,
split_part(replace(replace(replace(json_format(cast(array_agg(DISTINCT id) as JSON)), '[', ''), ']', ''), '"', ''),',',2)  as id_2
from mytable
CROSS JOIN UNNEST(data) as (id, weather)

对于单列:

select indicator,data 
replace(replace(replace(json_format(cast(array_agg(DISTINCT id) as JSON)), '[', ''), ']', ''), '"', '')  as id_new
from mytable
CROSS JOIN UNNEST(data) as (id, weather)
于 2021-02-04T14:27:23.013 回答