在 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 数据

在 Redshift 中解析一个 json 数组对象并转换为表格

在数组Vue Js中的另一个不同json对象中具有相同值的数组中的所有json对象中添加/合并新项目

如何在redshift上取消嵌套json字符串数组[重复]