【问题标题】:Aggregate JSON arrays within table rows / Apply format function to postgres JSON column在表行中聚合 JSON 数组/将格式函数应用于 postgres JSON 列
【发布时间】:2021-07-02 13:26:32
【问题描述】:

我有一个包含 jsonb-row 的 postgres 表,如下所示:

MyTable.refs
[{"url": "url1", "name": "name1"}, {"url": "url2", "name": "name2"}]
[]
[{"url": "url3", "name": "name3"}

我想写一个 postgres 函数来创建一个像这样的新列:

result
['<a href="url1">name1</a>', '<a href="url2">name2</a>']
[]
['<a href="url3">name3</a>'}

我已经有东西了:

SELECT
       jsonb_agg(format('<a href="%s">%s</a>', (elem ->> 'url'), (elem ->> 'name')))
FROM jsonb_array_elements('[{"url": "url1", "name": "name1"}, {"url": "url2", "name": "name2"}]'::jsonb) elem;

返回:

["<a href="url1">name1</a>", "<a href="url2">name2</a>"]

如何将此转换应用于整个列?

【问题讨论】:

  • 看来您已经有了解决方案。那你的问题到底是什么?
  • 我只能在一个 jsonb 元素上执行此操作,但我太笨了,无法将其应用于列/表。我敢肯定这很容易,所以请赐教!
  • 应该改进标题以反映实际问题。也许是“在表行中聚合 JSON 数组”?

标签: json postgresql jsonb


【解决方案1】:

我猜你正在寻找一个嵌套的选择语句:

with mytable (refs) as (
  values
    ('[{"url": "url1", "name": "name1"}, {"url": "url2", "name": "name2"}]'::jsonb),
    ('[]'),
    ('[{"url": "url3", "name": "name3"}]')
)
select (select coalesce(jsonb_agg(format('<a href="%s">%s</a>',
                                         elem->>'url', elem->>'name')),
                        '[]')
        from jsonb_array_elements(refs) elem) result
from mytable;

(顺便说一句,references 是 PostgreSQL 中的保留关键字,可能会导致混淆错误消息。)

【讨论】:

  • 谢谢,问题解决了! (我实际上并没有使用“引用”,仅用于此示例。将所有内容更改为“引用”。)
猜你喜欢
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-04
  • 2021-07-10
  • 2013-09-28
相关资源
最近更新 更多