如何从postgres jsonb数组中删除空值?

时间:2017-07-11 16:39:19

标签: postgresql jsonb postgresql-9.5

给定一个值为

的jsonb字段
{
  values: [null, 'test', { key: 'value' }]
}

是否可以返回

的输出
{
  values: [ 'test', { key: 'value' }]
}

我看过文档并发现了一些功能     jsonb_strip_nulls() 这只适用于具有空值和的键     array_remove() 我无法与jsonb合作。

我会用

UPDATE table 
  SET data = jsonb_set(data, '{values}'::text[], jsonb_agg(elem), false)
FROM data, 
     jsonb_array_elements(data-> 'values') WITH ORDINALITY AS t(elem, nr)
WHERE jsonb_typeof(elem) <> 'null'
GROUP BY (data.id)

这对于mose案例会正常工作,但我需要它来处理案例:

{
  values: [null, null, null]
}

以上查询不返回

{
  values: []
}

在这种情况下。

任何帮助都是适当的!谢谢......

2 个答案:

答案 0 :(得分:0)

使用coalesce可以实现这一目标:

WITH    test( data ) AS (
            VALUES
                ( $${"values": [null, "test", { "key": "value" }]}$$::jsonb ),
                ( $${"values": [null, null, null]}$$::jsonb )
        )
SELECT  jsonb_set(
            d.data,
            '{values}',
            coalesce(
                jsonb_agg(t.elem) FILTER ( WHERE NOT (t.elem = 'null') ),
                $$[]$$::jsonb
            ),
            FALSE
        )
FROM    test d,
        jsonb_array_elements( d.data-> 'values') WITH ORDINALITY AS t(elem)
GROUP BY d.data;


               jsonb_set
----------------------------------------
 {"values": ["test", {"key": "value"}]}
 {"values": []}
(2 rows)

注意:我使用FILTER代替WHERE检查null,但使用coalesce时,您的查询也可以使用。

答案 1 :(得分:0)

对于 PostgreSQL 12:

select jsonb_path_query_array('{"values": [null, "test", { "key": "value" }]}', '$.values[*] ? (@ != null)')