当列为空时,为什么 jsonb-functions 在更新时不起作用?

w.k*_*w.k 2 postgresql jsonb

我有一个带有jsonb列的表,其中列的默认值为null. 现在,当我第一次尝试使用数据更新此列时,jsonb_set或者jsonb_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 ('{}');
Run Code Online (Sandbox Code Playgroud)

现在我更新两个新记录:

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

结果:

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

即使更新对两个更新产生相同的结果,第一行仍然保持不变。

我查看了文档,但没有发现有关此类行为的任何信息。为什么它不能这样工作?

我正在使用 Postgres 9.6

a_h*_*ame 5

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

您将需要coalesce()在对 jsonb_set 的调用中使用:

UPDATE books 
   SET data = jsonb_set( coalesce(data, '{}'), '{zzz}', 'true', true) 
WHERE book_id = 1;
Run Code Online (Sandbox Code Playgroud)

请注意,对于函数的任何参数都是如此。
所以即使不为空jsonb_set(data, '{zzz}', null, true)也会产生。nulldata