sql >> Databáze >  >> RDS >> PostgreSQL

PostgreSQL:Odeberte atribut ze sloupce JSON

Aktualizovat :pro 9.5+ existují explicitní operátory, které můžete použít s jsonb (pokud máte json zadaný sloupec, můžete použít přetypování k použití modifikace):

Odstranění klíče (nebo indexu) z objektu JSON (nebo z pole) lze provést pomocí - operátor:

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

Smazání hluboko v hierarchii JSON lze provést pomocí #- operátor:

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

Pro verzi 9.4 můžete použít upravenou verzi původní odpovědi (níže), ale místo agregace řetězce JSON můžete agregovat do json objekt přímo pomocí json_object_agg() .

Související:další manipulace JSON v PostgreSQL:

  • Jak upravím pole v novém datovém typu PostgreSQL JSON?

Původní odpověď (platí pro PostgreSQL 9.3):

Pokud máte alespoň PostgreSQL 9.3, můžete svůj objekt rozdělit do párů pomocí json_each() a filtrujte svá nechtěná pole a poté znovu vytvořte json ručně. Něco jako:

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

S verzí 9.2 (nebo nižší) to není možné.

Upravit :

Pohodlnější formou je vytvořit funkci, která dokáže odstranit libovolný počet atributů v json pole:

Úprava 2 :string_agg() je levnější než 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$;

S touto funkcí vše, co musíte udělat, je spustit dotaz níže:

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


  1. Nejrychlejší způsob, jak zobrazit seznam všech databází na serveru SQL pomocí T-SQL

  2. Hromadné vložky Salesforce z aplikace Microsoft Access

  3. Hodnoty oddělené čárkou s dotazem SQL

  4. Jak vrátit seznam spouštěcích událostí na serveru SQL Server