【问题标题】:Merge elements from JSON array in Redshift在 Redshift 中合并 JSON 数组中的元素
【发布时间】: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 中完成同样的工作。

【问题讨论】:

    标签: arrays json 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-23
      • 2019-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多