Postgres 合并为空 JSONB 数组

Posted

技术标签:

【中文标题】Postgres 合并为空 JSONB 数组【英文标题】:Postgres coalesce to empty JSONB array 【发布时间】:2017-05-02 20:32:54 【问题描述】:

如何将coalesce null 列转换为空的JSONB 数组?这不起作用:

SELECT jsonb_array_elements(coalesce(null_column, ''::jsonb))
FROM table
WHERE id = 13;

-- ERROR:  cannot extract elements from an object

这都不是:

SELECT jsonb_array_elements(coalesce(null_column, '[]'::jsonb))
FROM table
WHERE id = 13;

-- ERROR:  cannot extract elements from a scalar

【问题讨论】:

这真的取决于null_column 的确切定义、其中允许的数据以及您的Postgres 版本。 【参考方案1】:

是一个对象,但 jsonb_array_elements 需要一个数组,因此将 替换为 []

确保两个参数都返回一个 jsonb 数组。例如,如果您的列是整数,您可以使用concat 添加方括号并使用::jsonb 进行转换

SELECT jsonb_array_elements(coalesce(concat('[',my_column,']')::jsonb,'[]'::jsonb))

【讨论】:

这很好用,但由于某些奇怪的原因,如果我使用列名而不是 null,我仍然会得到 cannot extract elements from a scalar @norbertpy 忘记解决这个问题 - 您必须将列值转换为 json 数组,因为合并中的两个参数都必须返回 json 数组 我的专栏肯定是 JSONB,但似乎 Postgres 无法判断它为空。甚至这个SELECT (CASE WHEN col IS NULL THEN 'is-null' ELSE 'is-not-null' END) AS r FROM t WHERE id = 13; 也会返回is-not-null 但这将是另一个问题。感谢您的投入。 @norbertpy 你确定 col 应该是 null 而不是在 json 中表示 null 的字符串吗?【参考方案2】:

这里是完成你想要的 SQL 代码:

SELECT jsonb_array_elements(coalesce(null_column, '[]'::jsonb))
FROM table
WHERE id = 13;

【讨论】:

以上是关于Postgres 合并为空 JSONB 数组的主要内容,如果未能解决你的问题,请参考以下文章

Postgres:在递归合并函数中删除 jsonb 键

Postgres 数组列与 JSONB 列

Postgres检查jsonb数组是不是不包含值返回空结果集

Postgres:从匿名jsonb数组元素中删除对象

在 Postgres 中优化 jsonb 数组值的 GROUP BY

postgres jsonb列中的模糊字符串匹配