如何从 postgres jsonb 数组中删除空值?
How can I remove null values from a postgres jsonb array?
给定一个值为
的 jsonb 字段
{
values: [null, 'test', { key: 'value' }]
}
是否可以 return 输出
{
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)
这在大多数情况下都可以正常工作,但我需要它来处理以下情况:
{
values: [null, null, null]
}
上面的查询没有return
{
values: []
}
在这种情况下。
欢迎任何帮助!!谢谢...
使用 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
,您的查询也应该有效。
对于 PostgreSQL 12:
select jsonb_path_query_array('{"values": [null, "test", { "key": "value" }]}', '$.values[*] ? (@ != null)')
给定一个值为
的 jsonb 字段{
values: [null, 'test', { key: 'value' }]
}
是否可以 return 输出
{
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)
这在大多数情况下都可以正常工作,但我需要它来处理以下情况:
{
values: [null, null, null]
}
上面的查询没有return
{
values: []
}
在这种情况下。
欢迎任何帮助!!谢谢...
使用 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
,您的查询也应该有效。
对于 PostgreSQL 12:
select jsonb_path_query_array('{"values": [null, "test", { "key": "value" }]}', '$.values[*] ? (@ != null)')