Actualizar un elemento json en json datatype


14

No puedo entender cómo puedo actualizar un elemento en un tipo de datos PostgreSQL 9.3.

Mi ejemplo:

CREATE TABLE "user"
(
  id uuid NOT NULL,
  password character varying(255),
  profiles json,
  gender integer NOT NULL DEFAULT 0,
  created timestamp with time zone,
  connected timestamp with time zone,
  modified timestamp with time zone,
  active integer NOT NULL DEFAULT 1,
  settings json,
  seo character varying(255) NOT NULL,
  CONSTRAINT id_1 PRIMARY KEY (id)
)
WITH (
  OIDS=TRUE
);
ALTER TABLE "user"
  OWNER TO postgres;

La parte de json en "perfiles"

{
    "Facebook": {
        "identifier": "xxxxxxxxxxx",
        "profileURL": "none",
        "webSiteURL": "none",
        "photoURL": "none",
        "displayName": "test2 test2",
        "description": "none",
        "firstName": "test2",
        "lastName": "test2",
        "gender": 2,
        "language": "none",
        "age": "none",
        "birthDay": "none",
        "birthMonth": "none",
        "birthYear": "none",
        "email": "test@test.com",
        "emailVerified": "none",
        "Added": null,
        "phone": "none",
        "address": "none",
        "country": "none",
        "region": "none",
        "city": "none",
        "zip": "none"
    },
    "Google": {
        "identifier": "xxxxxxxxxxxxxxxxxxxxxx",
        "profileURL": "none",
        "webSiteURL": "none",
        "photoURL": "none",
        "displayName": "test2 test2",
        "description": "none",
        "firstName": "test2",
        "lastName": "test2",
        "gender": 2,
        "language": "none",
        "age": "none",
        "birthDay": "none",
        "birthMonth": "none",
        "birthYear": "none",
        "email": "test@test.com",
        "emailVerified": "none",
        "Added": null,
        "phone": "none",
        "address": "none",
        "country": "none",
        "region": "none",
        "city": "none",
        "zip": "none"
    }
}

Estoy usando x-edit para la interfaz, y esperaba que algo como esto funcionara, pero no funciona:

UPDATE public.user 
SET "profiles"->'Facebook'->'social'->'facebook' = 'test' WHERE` id='id'

Parece que no puedo encontrar ninguna información sobre cómo actualizar un tipo de datos json.

Respuestas:


7

Como es solo una cadena, es posible que pueda realizar un simple cambio / eliminación de un nodo con la regex_replacefunción.

Por ejemplo, así es como eliminé recientemente un cierto nodo JSON en una tabla (todas las filas):

UPDATE my_db.my_table
SET my_column = (regexp_replace(my_column::text, ',"some_json_node":(.*),', ','))::json
WHERE NOT my_column IS NULL

Tenga en cuenta que, para todos mis datos JSON, mantengo un "version":"(n).(n)"nodo (es decir, versión de esquema) en el objeto. De esa manera puedo actualizar objetos que cumplan con una versión específica. Es posible que sus requisitos no sean tan complejos, pero si lo son, ciertamente ayuda.


Necesito esto para el objeto json como col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke

3

Creo que tendrá que actualizar el campo completo en Postgres 9.3, al menos esto es lo que me dice la documentación.

La actualización de elementos individuales en un documento JSON estará en 9.4 si no me equivoco.


2

Prueba esto

UPDATE Tablename
SET columnname = replace(columnname::TEXT,'"name":','"my-other-name"')::jsonb 
WHERE id = 1;

Necesito esto para el objeto json como col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.