为什么 jsonb-functions 在列为空时无法更新?
Why jsonb-functions does not work on update when column is null?
我有一个带有 jsonb
列的 table,其中该列的默认值为 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, '{zzz}', 'true', 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;
请注意,对于函数的 任何 参数都是如此。
因此 jsonb_set(data, '{zzz}', null, true)
也会产生 null
即使data
不为空。
我在 JSONB 变量中设置本机 JSON 值为 null 的方法如下:
IF condition = 1 THEN
response = jsonb_set(
jsonb_in => response::jsonb,
path => ('{response, data, my_key')::text[],
replacement => 'null'::jsonb,
create_if_missing => true
);
END IF;
我有一个带有 jsonb
列的 table,其中该列的默认值为 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, '{zzz}', 'true', 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;
请注意,对于函数的 任何 参数都是如此。
因此 jsonb_set(data, '{zzz}', null, true)
也会产生 null
即使data
不为空。
我在 JSONB 变量中设置本机 JSON 值为 null 的方法如下:
IF condition = 1 THEN
response = jsonb_set(
jsonb_in => response::jsonb,
path => ('{response, data, my_key')::text[],
replacement => 'null'::jsonb,
create_if_missing => true
);
END IF;