Atualizar um elemento json no tipo de dados json

14

Não consigo descobrir como atualizar um elemento em um tipo de dados PostgreSQL 9.3.

Meu exemplo:

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;

A parte json em "perfis"

{
    "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": "[email protected]",
        "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": "[email protected]",
        "emailVerified": "none",
        "Added": null,
        "phone": "none",
        "address": "none",
        "country": "none",
        "region": "none",
        "city": "none",
        "zip": "none"
    }
}

Estou usando o x-edit para o frontend e esperava que algo assim funcionasse, mas não:

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

Não consigo encontrar nenhuma informação sobre como atualizar um tipo de dados json.

Sebastien Deschamps
fonte

Respostas:

7

Como é apenas uma sequência, você poderá realizar uma simples alteração / exclusão de um nó com a regex_replacefunção

Por exemplo, foi assim que excluí recentemente um determinado nó JSON em uma tabela (todas as linhas):

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

Observe que, para todos os meus dados JSON, mantenho um "version":"(n).(n)"nó (ou seja, versão do esquema) no objeto. Dessa forma, eu posso atualizar objetos que estejam em conformidade com uma versão específica. Seus requisitos podem não ser tão complexos, mas se forem, certamente ajuda.

MikeM
fonte
Eu preciso disso para o objeto json como nome do col. Height = {'unit': 'cms', 'value': 150}
Rahul Dapke
3

Eu acho que você precisará atualizar o campo completo no Postgres 9.3, pelo menos é o que a documentação está me dizendo.

A atualização de elementos individuais em um documento JSON estará na 9.4, se não me engano.

frlan
fonte
2

Tente isto

UPDATE Tablename
SET columnname = replace(columnname::TEXT,'"name":','"my-other-name"')::jsonb 
WHERE id = 1;
Er.Chetan wagh
fonte
Eu preciso disso para o objeto json como nome do col. Height = {'unit': 'cms', 'value': 150}
Rahul Dapke