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

时间:2018-01-31 09:05:12

标签: json postgresql postgresql-9.4

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

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

结果是:

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

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

{{1}}

有可能吗?

1 个答案:

答案 0 :(得分:4)

使用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,则需要使用条件表达式,如果列不为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;