我需要将表中一行的列放到预定义的json结构中,但只有那些非空的。
我编写了以下代码,但现在我想知道如果它实际上有一个值我只能添加某个键。
IF(i_zone_id NOTNULL) THEN
SELECT to_jsonb(('[{"n": "' || coalesce("name"::text, '') || '",
"id": "' || coalesce(controller_zone_id::text, '') ||'",
"calc": "' || coalesce(calculate_using::text, '') || '",
"aa": "' || coalesce(anode_area::text, '') || '",
"ca": "' || coalesce(cathode_area::text, '') || '",
"startMonitoringInterval": "' || coalesce(start_mon_interval::text, '') || '",
"interval": "' || coalesce("interval"::text, '') || '",
"interval1": "' || coalesce(interval1::text, '') || '",
"mt": "' || coalesce(monitoring::text, '') || '",
"totalInterval": "' || coalesce(total_interval::text, '') || '"' ||
t_nodes ||
t_ppsus ||
'}]')::jsonb)
FROM cfg_zn
WHERE zone_id = i_zone_id
INTO jb_zone;
我想阻止将密钥添加到json数组中,如果它们是空的。
答案 0 :(得分:1)
这样的东西?
SELECT -- Eliminate all keys with 'null' values
jsonb_strip_nulls(
-- Build json objects structure
jsonb_build_object(
'n', "name"::text,
'id', controller_zone_id::text,
'calc', controller_zone_id::text,
'aa', anode_area::text,
'ca', cathode_area::text,
'startMonitoringInterval', start_mon_interval::text,
'interval', "interval"::text,
'interval1', interval1::text,
'mt', monitoring::text,
'totalInterval', total_interval::text
)
-- Concatenate jsonb columns
|| t_nodes
|| t_ppsus
)
FROM cfg_zn
WHERE zone_id = i_zone_id
INTO jb_zone;
我认为t_nodes
和t_ppsus
已经是自己的jsons。
有关json(b)函数和运算符的更多信息:https://www.postgresql.org/docs/current/static/functions-json.html