Обновить элемент 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)"(т.е. версию схемы) узел в объекте. Таким образом, я могу обновить объекты, которые соответствуют определенной версии. Ваши требования могут быть не такими сложными, но если они есть, это, безусловно, помогает.


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

3

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

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


2

Попробуй это

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

Мне это нужно для объекта json, такого как col name height = {'unit': 'cms', 'value': 150}
Рахул Дапке
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.