PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để sửa đổi một giá trị thuộc tính duy nhất bên trong kiểu dữ liệu PostgreSQL JSONB?

Đố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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nếu số lượng PostgreSQL (*) luôn chậm, làm thế nào để phân trang các truy vấn phức tạp?

  2. Lưu trữ và truy vấn cây khoảng thời gian trong PostgreSQL

  3. Postgresql:Không thể truy cập vào tệp «$ libdir / postgis-2.1» không có tệp hoặc thư mục như vậy

  4. Bản ghi hoạt động:Truy vấn JSON

  5. Nối các bảng trên các cột của khóa ngoại / khóa chính tổng hợp trong một truy vấn