为什么当column为null时jsonb-functions在更新时不起作用?

问题描述

我有一个带有jsonb列的表,该列的认值为null。现在,当我第一次尝试使用jsonb_setjsonb_insert用数据更新此列时,结果是UPDATE 1,但实际上,列仍为null

我做了一些测试用例:

CREATE SCHEMA test;
CREATE TABLE test.books (  
  book_id serial NOT NULL,data jsonb
);

INSERT INTO test.books (data) VALUES (null);
INSERT INTO test.books (data) VALUES ('{}');

现在我更新两个新记录:

UPDATE test.books SET data = jsonb_set( data,'{zzz}','true',true) WHERE book_id = 1;
UPDATE test.books SET data = jsonb_set( data,true) WHERE book_id = 2;

结果:

# select * from test.books;
 book_id |                data                
---------+------------------------------------
       2 | {"zzz": true}
       1 | 
(2 rows)

即使两次更新的结果相同,第一行也保持不变。

我查看了文档,但对这种行为一无所获。为什么它不能这样工作?

我正在使用Postgres 9.6

解决方法

这是因为jsonb_set()被定义为strict,这意味着如果任何输入参数为null,则结果为空。

在调用jsonb_set时需要使用coalesce()

UPDATE books 
   SET data = jsonb_set( coalesce(data,'{}'),'{zzz}','true',true) 
WHERE book_id = 1;

请注意,该函数参数的 any 都是如此。
因此,即使jsonb_set(data,null,true)null也会产生data不为空。