在 Redshift 中合并 JSON 数组中的元素
Posted
技术标签:
【中文标题】在 Redshift 中合并 JSON 数组中的元素【英文标题】:Merge elements from JSON array in Redshift 【发布时间】:2021-12-30 09:45:28 【问题描述】:在 Redshift 数据库中 text
类型的列中有以下 JSON 数据
genres |
---|
["drama","action","comedy"] |
["drama","comedy","thriller"] |
["drama","romance"] |
我想使用自定义分隔符将它们组合成文本
genres |
---|
drama|action|comedy |
drama|comedy|thriller |
drama|romance |
我看到有一些solutions available in Postgres,但我的问题是如何在 Amazon Redshift 中完成同样的工作。
【问题讨论】:
【参考方案1】:由于genres
与 json 兼容,您可以使用超类型、PartiQL 和一些列表聚合来完成此操作。
让我们做一些表格。
create temporary table _so (
genres text
);
insert into _so values
('["drama","action","comedy"]'),
('["drama","comedy","thriller"]'),
('["drama","romance"]');
这里的基本模式是将列转换为超类型 (supered
),使用 PartiQL 将值转换为行 (super_pivot
),然后在将这些字符串值转换回字符串后聚合它们。 (lag
)。
with supered as (
select
json_parse(genres) genres
from
_so
), super_pivot as (
select
sup.genres,
item
from
supered as sup,
sup.genres as item
), lag as (
select
genres,
listagg(cast(item as varchar), '|') delimited
from
super_pivot
group by
genres
)
select * from lag;
请注意,这假定 genres
是唯一的。如果不是,也许可以创建一个row_number
或稍后汇总的内容,这样您最终会得到与起点相同的行数。
genres | delimited |
---|---|
["drama","comedy","thriller"] | drama|comedy|thriller |
["drama","action","comedy"] | drama|action|comedy |
["drama","romance"] | drama|romance |
【讨论】:
以上是关于在 Redshift 中合并 JSON 数组中的元素的主要内容,如果未能解决你的问题,请参考以下文章
在 Redshift 中的不同行上返回 JSON 数组列的元素
从 Amazon Redshift 中的 json 数组中提取特定键
在 Redshift 中解析一个 json 数组对象并转换为表格