Postgres json_object。仅当value不为null时添加json字段

Wit*_*tos 2 postgresql json postgresql-9.4

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

select json_build_object('name', p.name, 'birthday', p.birthday)
FROM Person p limit 2
Run Code Online (Sandbox Code Playgroud)

结果是:

{"name":"John", "birthday", "2000-01-01"}
{"name":"George", "birthday", "null"}
Run Code Online (Sandbox Code Playgroud)

现在,如您在第二行所看到的,生日为null。在那种情况下,我希望那里不存在JSON字段(生日),因此结果将是:

{"name":"John", "birthday", "2000-01-01"}
{"name":"George"}
Run Code Online (Sandbox Code Playgroud)

可能吗?

a_h*_*ame 8

使用 json_strip_nulls()

select json_strip_nulls(json_build_object('name', p.name, 'birthday', p.birthday))
FROM person p 
limit 2;
Run Code Online (Sandbox Code Playgroud)

编辑1(问题扩展后)

如果您想有条件地执行此操作,则可以使用jsonb进行操作(因为它支持||运算符)

select jsonb_build_object('name', p.name) || jsonb_strip_nulls(jsonb_build_object('birthday', p.birthday))
from person p;
Run Code Online (Sandbox Code Playgroud)

编辑2(发布Postgres版本后)

如果限于Postgres的旧版本,则需要使用条件表达式,其中仅在列不为null的情况下才连接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;
Run Code Online (Sandbox Code Playgroud)