【问题标题】:Return elements of JSON array column on separate rows in Redshift在 Redshift 中的不同行上返回 JSON 数组列的元素
【发布时间】:2020-01-13 08:36:01
【问题描述】:

我有一个 Redshift 表,其中一列中有一个 JSON 数组:

 id | metadata
---------------------------------------------------------------------------
 1  | [{"pet":"dog","country":"uk"}, {"pet":"cat","country":"us"}]
 2  | [{"pet":"cat","country":"uk"}]
 3  | []

我想要一个如下所示的表格:

 id |   pet   |  country
------------------------
 1  | dog       | uk
 1  | cat       | us
 2  | cat       | uk

有没有办法在 Redshift 表上使用 sql 命令和/或 python 用户定义函数来做到这一点

【问题讨论】:

    标签: python postgresql amazon-redshift user-defined-functions


    【解决方案1】:

    我将这种(丑陋的)方法用于 Redshift。让seq 成为一个包含单个字段num 的表,其中包含从 1 到 10000 的数字(假设一行中的宠物不超过 10000 只)。您可以使用generate_series(1, 10000),但由于奇怪的原因它会变慢:(

    select
      id,
      JSON_EXTRACT_PATH_TEXT(single_metadata, 'pet') as pet,
      JSON_EXTRACT_PATH_TEXT(single_metadata, 'country') as country
    from
    (
      select
        t.id,
        cast(JSON_EXTRACT_ARRAY_ELEMENT_TEXT(t.metadata, num) as json) as single_metadata
      from 
        t join seq -- or (select num from generate_series(1, 10000))
      on num <= json_array_length(t.metadata)
    )
    

    【讨论】:

    • 我试过这个,但我不想硬编码数字,比如这里到 10000
    • 你可以通过select max(json_array_length(t.metadata)) from t这样的查询得到这个号码
    • 所以我有一个表 seq CREATE TEMP TABLE seq (i int); INSERT INTO seq VALUES(0),(1),(2); 但我如何使用 select max(json_array_length(t.metadata)) 作为插入选择组合命令在 seq 中插入数据?
    • 只能通过python脚本:(
    猜你喜欢
    • 2015-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多