问题描述
我有一个带有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 ('{}');
现在我更新两个新记录:
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
不为空。