【问题标题】:Turning a simple json array to a csv string using PostgreSQL使用 PostgreSQL 将简单的 json 数组转换为 csv 字符串
【发布时间】:2021-07-15 13:57:14
【问题描述】:

我尝试查看已经开放的问题,但不幸的是没有任何帮助。 我正在尝试使用 jsonb_array_elements 和 string_agg 函数将 json 数组转换为用逗号分隔的字符串,但无论我如何尝试,我都会收到相同的错误 - “错误:无法从标量中提取元素”

假设我的 JSON 数据如下所示:{ "id" : "hi", "list" : ["a", "b", "c"] }

我想要得到的是一个查询,其结果如下所示:[id, list participants] = [hi, a,b,c]

我尝试了一些不同的方法,但最近的一个是:

select (select string_agg(t->>0, ',') from jsonb_array_elements(data->'list') as t) from my_table

非常感谢您对此的任何帮助

【问题讨论】:

    标签: string postgresql data-manipulation


    【解决方案1】:

    例如,您可以这样做

    with c as (
    select 1,'{ "id" : "hi", "list" : ["a", "b", "c"] }'::jsonb->>'id' as value 
    union 
    select 2,string_agg(t->>0, ',') from jsonb_array_elements('{ "id" : "hi", "list" : ["a", "b", "c"] }'::jsonb->'list') as t
    )
    select string_agg(c.value,',') from c order by 1
    

    【讨论】:

    • 嘿,谢谢!只是一个问题,使用 select 2 命令我不会得到同样的错误吗?因为这与我尝试用于我的案例的方法相同?
    【解决方案2】:

    因此,在使用多种不同方法进行了大量尝试之后 - 尝试的每种方法都导致相同的“错误:无法从标量中提取元素”。

    我最终发现问题不是查询,而是数据! 如果数据中的列表之一为空(“{[]}”),则会导致该错误。因此,在使用 WHERE 子句从查询中排除那些空列表之后,我终于让它工作了!谢谢,希望这篇文章能帮助未来沮丧的查询用户:)

    作为参考,我最终选择的方法是:

    SELECT t.tbl, d.list
    FROM tbl t, LATERAL (
         SELECT string_agg(value::text, ', ') AS list
         FROM json_array_elements_text(t.data->'tags')
    ) d
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-05
      • 2015-06-08
      • 2013-05-05
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多