我正在从具有JSON列和非JSON列的表中构建JSON ARRAY。
这是我的示例数据和查询:
create table check_details(SHORT_NAME VARCHAR, UNIQUE_NO JSON,STATUS VARCHAR);
insert into check_details values('Anu','{"ID":"1e699-76af2"}','REJECTED');
select json_agg(json_strip_nulls(
json_build_object('Name',SHORT_NAME,
'IDS',
jsonb_build_array(case SIGN(position('ACCEPTED' in STATUS) ) when 1 then UNIQUE_NO::jsonb->>'ID' else json_typeof(NULL::json) end)
)))
from check_details;
我得到这个结果:
[{"Name":"Anu","IDS":[null]}]
但是当键IDS的值为NULL时,我不想在结果中得到“ IDS”:[null]部分。如何获得此结果:
[{"Name":"Anu"}]
当IDS具有有效值时,它必须是一个数组。因此,使用jsonb_build_array。
这是因为您将CASE语句的结果放置在JSON数组中,所以它是一个非空数组,其中包含JSON空值而不是空JSON值。
因此,如果要剥离NULL,则需要停止将其作为数组:
SELECT
json_strip_nulls(
json_build_object(
'Name',
short_name,
'IDS',
CASE SIGN(position('ACCEPTED' IN status) )
WHEN 1 THEN (unique_no::jsonb->>'ID')::text
ELSE NULL
END
)
)
FROM
check_details;
json_strip_nulls
------------------
{"Name":"Anu"}
(1 row)
请注意,json_strip_nulls()不会从JSON数组中删除空值。
编辑:但由于您需要非空值才能显示为数组,因此请将jsonb_build_array()函数移至case语句中]
SELECT
json_strip_nulls(
json_build_object(
'Name',
short_name,
'IDS',
CASE SIGN(position('ACCEPTED' IN status) )
WHEN 1 THEN jsonb_build_array((unique_no::jsonb->>'ID')::text)
ELSE NULL
END
)
)
FROM
check_details;