Оновіть елемент 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 для редагування, і я сподівався, що щось подібне спрацює, але це не так:

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 = {'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 = {'unit': 'cms', 'value': 150}
Rahul Dapke
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.