Saltar al contenido

PostgreSQL: Quitar attribute de la columna JSON

Nuestro grupo especializado luego de algunos días de trabajo y recopilación de de información, encontramos los datos necesarios, nuestro deseo es que todo este artículo sea de gran utilidad en tu plan.

Solución:

Actualizar: para 9.5+, hay operadores explícitos que puede usar con jsonb (Si tienes un json columna escrita, puede usar conversiones para aplicar una modificación):

Borrando un key (o un índice) de un objeto JSON (o, de un array) se puede hacer con el - operador:

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

La eliminación, desde lo profundo de una jerarquía JSON, se puede hacer con el #- operador:

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

Para 9.4, puede usar una versión modificada de la respuesta original (a continuación), pero en lugar de agregar un JSON stringpuede agregar en un json objeto directamente con json_object_agg().

Relacionado: otras manipulaciones de JSON dentro de PostgreSQL:

  • ¿Cómo modifico campos dentro del nuevo tipo de datos PostgreSQL JSON?

respuesta original (se aplica a PostgreSQL 9.3):

Si tiene al menos PostgreSQL 9.3, puede dividir su objeto en pares con json_each() y filtre sus campos no deseados, luego vuelva a construir el json manualmente. Algo como:

SELECT data::text::json AS before,
       ('')::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

Con 9.2 (o inferior) no es posible.

Editar:

Una forma más conveniente es crear una función, que puede eliminar cualquier número de attributes en un json campo:

Editar 2: string_agg() es menos costoso que 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 (' "value", ',') ')
   FROM json_each("json")
   WHERE "key" <> ALL ("keys_to_delete")),
  ''
)::json
$function$;

Con esta función, todo lo que necesita hacer es ejecutar la consulta a continuación:

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

Esto se ha vuelto mucho más fácil con PostgreSQL 9.5 usando el tipo JSONB. Vea los operadores JSONB documentados aquí.

Puede eliminar un nivel superior attribute con el operador “-“.

SELECT '"a": "key":"value", "b": 2, "c": true'::jsonb - 'a'
// -> "b": 2, "c": true

Puede usar esto dentro de una llamada de actualización para actualizar un campo JSONB existente.

UPDATE my_table SET data = data - 'attrB'

También puede proporcionar la attribute nombre dinámicamente a través de un parámetro si se usa en una función.

CREATE OR REPLACE FUNCTION delete_mytable_data_key(
    _id integer,
    _key character varying)
  RETURNS void AS
$BODY$
BEGIN
    UPDATE my_table SET
        data = data - _key
    WHERE id = _id;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

El operador inverso es el “||”, para concatenar dos paquetes JSONB juntos. Tenga en cuenta que el uso más a la derecha de la attribute sobrescribirá los anteriores.

SELECT '"a": true, "c": true'::jsonb || '"a": false, "b": 2'::jsonb 
// -> "a": false, "b": 2, "c": true

no pude conseguir SELECT '"a": "b"'::jsonb - 'a'; para trabajar en 9.5.2. Sin embargo, SELECT '"a": "b"'::jsonb #- 'a'; funcionó!

Comentarios y calificaciones

Si para ti ha resultado de ayuda este post, sería de mucha ayuda si lo compartes con el resto juniors de esta manera nos ayudas a extender este contenido.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *