我有一个带有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
这是因为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
| 归档时间: |
|
| 查看次数: |
77 次 |
| 最近记录: |