PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL:Премахнете атрибута от колоната JSON

Актуализиране :за 9.5+ има изрични оператори, които можете да използвате с jsonb (ако имате json въведена колона, можете да използвате cast, за да приложите модификация):

Изтриването на ключ (или индекс) от JSON обект (или от масив) може да се извърши с - оператор:

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

Изтриването от дълбоко в йерархията на JSON може да се извърши с #- оператор:

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

За 9.4 можете да използвате модифицирана версия на оригиналния отговор (по-долу), но вместо да агрегирате JSON низ, можете да агрегирате в json обект директно с json_object_agg() .

Свързани:други JSON манипулации в PostgreSQL:

  • Как да променя полета в новия PostgreSQL JSON тип данни?

Оригинален отговор (отнася се за PostgreSQL 9.3):

Ако имате поне PostgreSQL 9.3, можете да разделите обекта си на двойки с json_each() и филтрирайте нежеланите си полета, след което изградете json отново ръчно. Нещо като:

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

С 9.2 (или по-ниска) това не е възможно.

Редактиране :

По-удобна форма е да създадете функция, която може да премахне произволен брой атрибути в json поле:

Редактиране 2 :string_agg() е по-евтино от 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$;

С тази функция всичко, което трябва да направите, е да изпълните заявката по-долу:

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

  2. Сравнителен анализ, управлявани PostgreSQL облачни решения:Част втора – Amazon RDS

  3. Намерете записи, където присъединяването не съществува

  4. Създайте PostgreSQL база данни в движение, като използвате Hibernate, дори ако DB не съществува

  5. PostgreSQL управление и автоматизация с ClusterControl