Postgres json_object。仅当值不为空时才添加 json 字段

问题描述 投票:0回答:2

我使用 jsob_build_object 函数从表中的数据生成 json。

select json_build_object('name', p.name, 'birthday', p.birthday)
FROM Person p limit 2

结果是:

{"name":"John", "birthday", "2000-01-01"}
{"name":"George", "birthday", "null"}

现在您可以在第二行中看到生日为空。在这种情况下,我希望 JSON 字段(生日)不出现在那里,所以结果将是:

{"name":"John", "birthday", "2000-01-01"}
{"name":"George"}

可以吗?

json postgresql postgresql-9.4
2个回答
32
投票

使用

json_strip_nulls()

select json_strip_nulls(json_build_object('name', p.name, 'birthday', p.birthday))
FROM person p 
limit 2;

编辑1(问题扩展后)

如果您想有条件地执行此操作,可以使用 jsonb 来执行此操作(因为它支持

||
运算符)

select jsonb_build_object('name', p.name) || jsonb_strip_nulls(jsonb_build_object('birthday', p.birthday))
from person p;

编辑2(Postgres版本公开后)

如果您仅限于旧版本的 Postgres,则需要使用条件表达式,仅当列不为空时才连接 JSON 对象:

select jsonb_build_object('name', p.name) 
       || case 
             when birthday is null then '{}'::jsonb 
             else jsonb_build_object('birthday', p.birthday) 
          end
from person p;

0
投票

虽然问题被标记为 ,但自 以来,有一个新的、更好的解决方案可用。它引入了 JSON 构造函数,例如

json_object

如果指定了

ABSENT ON NULL
,则如果 value_expression
NULL
,则忽略整个对。

所以你可以使用

SELECT json_object('name': p.name, 'birthday': p.birthday, ABSENT ON NULL)
FROM Person p
LIMIT 2;

对于 JSONB,没有

jsonb_object
函数,而是使用

json_object(… ABSENT ON NULL RETURNING jsonb)
© www.soinside.com 2019 - 2024. All rights reserved.