在postgresql中用空值更新jsonb列

uqjltbpv  于 2021-08-01  发布在  Java
关注(0)|答案(2)|浏览(462)

我正在尝试更新以下内容 y.data ,这是一个jsonb类型的列,当前包含空值。这个 || 命令似乎无法合并在一起 y.datax.data 什么时候 x.data 为空。它工作的时候很好 x.data 包含jsonb值。
下面是一个查询示例。

UPDATE x
SET x.data = y.data::jsonb || x.data::jsonb
FROM (VALUES ('2018-05-24', 'Nicholas', '{"test": "abc"}')) AS y (post_date, name, data)
WHERE x.post_date::date = y.post_date::date AND x.name = y.name;

修改此查询以支持更新的最佳方式是什么 x.data 对于同时具有现有值或为空的行?

gupuwyp2

gupuwyp21#

连接任何与 null 生产 null . 你可以用 coalesce() 或条件逻辑来解决这个问题:

SET x.data = COALESCE(y.data::jsonb || x.data, y.data::jsonb)

或:

SET x.data = CASE WHEN x.data IS NULL 
    THEN y.data::jsonb
    ELSE y.data::jsonb || x.data
END

请注意,没有必要明确铸造 x.datajsonb ,因为这是一个 jsonb 列已存在。

v1uwarro

v1uwarro2#

在sql中,最好假设将null添加到某个对象会使整个对象为null。要解决上述问题,请尝试以下操作:

test(5432)=# SELECT '[1, 2, "foo", null]'::jsonb || null;
 ?column? 
----------
 NULL

SELECT '[1, 2, "foo", null]'::jsonb || coalesce(NULL, '[]'::jsonb);
      ?column?       
---------------------
 [1, 2, "foo", null]

聚结物给身体提供了一些东西 || 就是这样 NOT NULL . 如果你想要一些不同的东西,那么修改问题来表示。

相关问题