Postgres-从json数组中删除NULL值

问题描述 投票:1回答:1

我正在从具有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。

postgresql
1个回答
0
投票

这是因为您将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;
© www.soinside.com 2019 - 2024. All rights reserved.