Postgresql在数组中添加项,除非为null

时间:2018-03-29 15:53:23

标签: sql json postgresql

我尝试使用JSONB字段中的值创建PostgreSQL数组。

当所有数据都在JSONB中时,结果很好。这个查询:

SELECT array [
    (SELECT ('{"tech_id": 4, "admin_id": 5}'::jsonb->>'admin_id')::int),
    (SELECT ('{"tech_id": 4, "admin_id": 5}'::jsonb->>'tech_id')::int)
];

返回正确的结果,因为 admin_id tech_id 位于JSONB字段中:

-[ RECORD 1 ]
array | {5,4}

但是,如果JSONB只包含一个值,则该数组包含NULL值。 这个查询:

SELECT array [
    (SELECT ('{"tech_id": 4}'::jsonb->>'admin_id')::int),
    (SELECT ('{"tech_id": 4}'::jsonb->>'tech_id')::int)
];

给我这个结果:

-[ RECORD 1 ]---
array | {NULL,4}

但我想要一个像 {4} 这样的数组,所以没有NULL值。 你知道在这种情况下避免添加NULL值的方法吗?

1 个答案:

答案 0 :(得分:0)

Finnaly,我通过包装数组来检查值是否为NULL来找到解决方案。 我使用以下代码:

select array_agg(id) FROM unnest(array [
    (SELECT ('{"tech_id": 4}'::jsonb->>'admin_id')::int),
    (SELECT ('{"tech_id": 4}'::jsonb->>'tech_id')::int)
]) as id where id IS NOT NULL;

PostgreSQL返回预期结果:

-[ RECORD 1 ]--
array_agg | {4}