PostgreSQL:将JSON数组打印为CSV

PostgreSQL:将JSON数组打印为CSV,sql,arrays,json,string,postgresql,Sql,Arrays,Json,String,Postgresql,这个问题与[A]相似,但更深一点 让我们假设一个表mytable,其中有一列data,类型为jsonb,包含字符串的JSON数组: data ---- ['olaf','anna'] ['elsa','kristoff','sven'] 我想将它们打印为逗号分隔的列表: data_csv -------- 'olaf,anna' 'elsa,kristoff,sven' 如果mytable有一个ID列,那么[A]将基本上起作用,它提出了jsonb_数组_元素和分组依据: select i

这个问题与[A]相似,但更深一点

让我们假设一个表
mytable
,其中有一列
data
,类型为
jsonb
,包含字符串的JSON数组:

data
----
['olaf','anna']
['elsa','kristoff','sven']
我想将它们打印为逗号分隔的列表:

data_csv
--------
'olaf,anna'
'elsa,kristoff,sven'
如果
mytable
有一个ID列,那么[A]将基本上起作用,它提出了
jsonb_数组_元素
分组依据

select
  id,
  string_agg(j.value->>0, ',')
from
  mytable m,
  jsonb_array_elements(x.z) j
group by m.id;
但是,即使我们有一个
id
列,这个解决方案似乎也不是很有效,因为它涉及一个嵌套循环:

如果没有ID列,我们如何做到这一点,更重要的是,我们如何高效地做到这一点?这可以通过PL/pgSQL实现吗


[A] 您可以取消测试并聚合。横向联接可能比外部聚合更有效(并且不要求表具有主键):


您可以取消测试并聚合。横向联接可能比外部聚合更有效(并且不要求表具有主键):


啊,很好,这确实是一个很大的进步!但这是最优的吗?查询计划仍然显示一个嵌套循环-我们能做得更好吗?@CC.:我现在想不出来。。。当然,除此之外,还要将json数组转换为其字符串表示形式(如
data::text
),然后应用字符串函数删除周围的方括号。但这听起来相当肮脏。啊,很好,这确实是一个很大的进步!但这是最优的吗?查询计划仍然显示一个嵌套循环-我们能做得更好吗?@CC.:我现在想不出来。。。当然,除此之外,还要将json数组转换为其字符串表示形式(如
data::text
),然后应用字符串函数删除周围的方括号。但这听起来相当肮脏。
select t.*, d.data_csv
from mytable t
cross join lateral (
    select string_agg(val, ',') data_csv
    from jsonb_array_elements_text(t.data) x(val)
) d