Обновить элемент json в типе данных json

14

Я не могу понять, как я могу обновить элемент в типе данных PostgreSQL 9.3.

Мой пример:

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;

JSON часть в «профилях»

{
    "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"
    }
}

Я использую X-Edit для внешнего интерфейса, и я надеялся, что что-то вроде этого будет работать, но это не так:

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

Кажется, я не могу найти информацию о том, как обновить тип данных json.

Себастьян Дешам
источник

Ответы:

7

Поскольку это просто строка, вы можете выполнить простое изменение / удаление узла с помощью regex_replaceфункции.

Например, вот как я недавно удалил определенный узел JSON в таблице (все строки):

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

Обратите внимание, что для всех моих данных JSON я сохраняю "version":"(n).(n)"(т.е. версию схемы) узел в объекте. Таким образом, я могу обновить объекты, которые соответствуют определенной версии. Ваши требования могут быть не такими сложными, но если они есть, это, безусловно, помогает.

MikeM
источник
Мне это нужно для объекта json, например col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke
3

Я думаю, вам придется обновить полное поле на Postgres 9.3, по крайней мере, это то, что говорит мне документация.

Обновление отдельных элементов в документе JSON будет в 9.4, если я не ошибаюсь.

frlan
источник
2

Попробуй это

UPDATE Tablename
SET columnname = replace(columnname::TEXT,'"name":','"my-other-name"')::jsonb 
WHERE id = 1;
Эр.четан вау
источник
Мне это нужно для объекта json, такого как col name height = {'unit': 'cms', 'value': 150}
Рахул Дапке