Đối số thứ ba của jsonb_set()
phải là jsonb
loại hình. Vấn đề là khi truyền một chuỗi văn bản sang chuỗi jsonb, bạn cần một chuỗi trong dấu ngoặc kép. Bạn có thể sử dụng concat()
hoặc format()
:
update animal
set info =
jsonb_set(info, '{location}', concat('"', lower(info->>'location'), '"')::jsonb, true)
-- jsonb_set(info, '{location}', format('"%s"', lower(info->>'location'))::jsonb, true)
where id='49493'
returning *;
id | info
-------+------------------------------------------------------------------
49493 | {"habit1": "fly", "habit2": "dive", "location": "sonoma narite"}
(1 row)
Trong Postgres 9.4 bạn nên hủy bỏ cột json bằng cách sử dụng jsonb_each_text (), các khóa và giá trị tổng hợp sửa đổi giá trị thích hợp một cách nhanh chóng và cuối cùng là xây dựng một đối tượng json:
update animal a
set info = u.info
from (
select id, json_object(
array_agg(key),
array_agg(
case key when 'location' then lower(value)
else value end))::jsonb as info
from animal,
lateral jsonb_each_text(info)
group by 1
) u
where u.id = a.id
and a.id = 49493;
Nếu bạn có thể tạo các chức năng, giải pháp này có thể dễ chịu hơn:
create or replace function update_info(info jsonb)
returns jsonb language sql as $$
select json_object(
array_agg(key),
array_agg(
case key when 'location' then lower(value)
else value end))::jsonb
from jsonb_each_text(info)
$$
update animal
set info = update_info(info)
where id = 49493;