PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

PostgreSQL:Usuń atrybut z kolumny JSON

Aktualizacja :dla wersji 9.5+ istnieją wyraźne operatory, których można używać z jsonb (jeśli masz json wpisaną kolumnę, możesz użyć rzutowania, aby zastosować modyfikację):

Usunięcie klucza (lub indeksu) z obiektu JSON (lub z tablicy) można wykonać za pomocą - operator:

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

Usuwanie z głębi hierarchii JSON można wykonać za pomocą #- operator:

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

W wersji 9.4 możesz użyć zmodyfikowanej wersji oryginalnej odpowiedzi (poniżej), ale zamiast agregować ciąg JSON, możesz zagregować w json obiekt bezpośrednio za pomocą json_object_agg() .

Powiązane:inne manipulacje JSON w PostgreSQL:

  • Jak modyfikować pola wewnątrz nowego typu danych PostgreSQL JSON?

Oryginalna odpowiedź (dotyczy PostgreSQL 9.3):

Jeśli masz przynajmniej PostgreSQL 9.3, możesz podzielić swój obiekt na pary za pomocą json_each() i odfiltruj niechciane pola, a następnie ponownie ręcznie zbuduj json. Coś takiego:

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

W wersji 9.2 (lub niższej) nie jest to możliwe.

Edytuj :

Wygodniejszą formą jest utworzenie funkcji, która może usunąć dowolną liczbę atrybutów w json pole:

Edytuj 2 :string_agg() jest tańszy niż 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$;

Dzięki tej funkcji wystarczy uruchomić poniższe zapytanie:

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. Dzień programisty PostgreSQL w Pradze 2016

  2. SQL INSERT bez określania kolumn. Co się dzieje?

  3. Jak podzielić transakcje tylko do odczytu i do odczytu i zapisu za pomocą JPA i Hibernate

  4. Hibernacja + PostgreSQL + Typ adresu sieciowego (inet, cdir)

  5. Przechowywanie strefy czasowej w znaczniku czasu typu danych ze strefą czasową