在 table 行内聚合 JSON 数组/将格式函数应用于 postgres JSON 列

Aggregate JSON arrays within table rows / Apply format function to postgres JSON column

我有一个 postgres table,其中包含这样一个 jsonb 行:

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

我想编写一个创建新列的 postgres 函数,如下所示:

结果
['<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;

哪个returns:

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

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

我猜您正在寻找嵌套的 select 语句:

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 中的保留关键字,可能会导致错误消息令人困惑。)