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

PostgreSQL:Xóa thuộc tính khỏi cột JSON

Cập nhật :cho 9.5+, có những toán tử rõ ràng bạn có thể sử dụng với jsonb (nếu bạn có json cột đã nhập, bạn có thể sử dụng phôi để áp dụng sửa đổi):

Xóa khóa (hoặc chỉ mục) khỏi đối tượng JSON (hoặc khỏi mảng) có thể được thực hiện bằng - nhà điều hành:

SELECT jsonb '{"a":1,"b":2}' - 'a', -- will yield jsonb '{"b":2}'
       jsonb '["a",1,"b",2]' - 1    -- will yield jsonb '["a","b",2]'

Có thể thực hiện xóa từ sâu trong hệ thống phân cấp JSON bằng #- nhà điều hành:

SELECT '{"a":[null,{"b":[3.14]}]}' #- '{a,1,b,0}'
-- will yield jsonb '{"a":[null,{"b":[]}]}'

Đối với 9.4, bạn có thể sử dụng phiên bản đã sửa đổi của câu trả lời gốc (bên dưới), nhưng thay vì tổng hợp một chuỗi JSON, bạn có thể tổng hợp thành một json đối tượng trực tiếp với json_object_agg() .

Liên quan:các thao tác JSON khác trong PostgreSQL:

  • Làm cách nào để sửa đổi các trường bên trong kiểu dữ liệu PostgreSQL JSON mới?

Câu trả lời ban đầu (áp dụng cho PostgreSQL 9.3):

Nếu bạn có ít nhất PostgreSQL 9.3, bạn có thể chia đối tượng của mình thành từng cặp với json_each() và lọc các trường không mong muốn của bạn, sau đó tạo lại json theo cách thủ công. Một cái gì đó như:

SELECT data::text::json AS before,
       ('{' || array_to_string(array_agg(to_json(l.key) || ':' || l.value), ',') || '}')::json AS after
FROM (VALUES ('{"attrA":1,"attrB":true,"attrC":["a","b","c"]}'::json)) AS v(data),
LATERAL (SELECT * FROM json_each(data) WHERE "key" <> 'attrB') AS l
GROUP BY data::text

Với 9.2 (hoặc thấp hơn) thì không thể.

Chỉnh sửa :

Một hình thức thuận tiện hơn là tạo một hàm, hàm này có thể loại bỏ bất kỳ số lượng thuộc tính nào trong json lĩnh vực:

Chỉnh sửa 2 :string_agg() rẻ hơn array_to_string(array_agg())

CREATE OR REPLACE FUNCTION "json_object_delete_keys"("json" json, VARIADIC "keys_to_delete" TEXT[])
  RETURNS json
  LANGUAGE sql
  IMMUTABLE
  STRICT
AS $function$
SELECT COALESCE(
  (SELECT ('{' || string_agg(to_json("key") || ':' || "value", ',') || '}')
   FROM json_each("json")
   WHERE "key" <> ALL ("keys_to_delete")),
  '{}'
)::json
$function$;

Với chức năng này, tất cả những gì bạn cần làm là chạy truy vấn bên dưới:

UPDATE my_table
SET data = json_object_delete_keys(data, 'attrB');


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL Streaming Replication - Deep Dive

  2. nhận id của nhiều hàng được chèn vào psycopg2

  3. Làm thế nào để ghi DataFrame vào bảng postgres?

  4. Cột động trong postgres câu lệnh SELECT

  5. Các công cụ mã nguồn mở hàng đầu cho PostgreSQL Migrations