Postgres json_object。仅当值不为空时才添加 json 字段
Postgres json_object. Add json field only if value is not null
我正在使用 jsob_build_object 函数从我 table 中的数据生成 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_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;
我正在使用 jsob_build_object 函数从我 table 中的数据生成 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_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;