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)"、オブジェクトに(つまり、スキーマバージョン)ノードを保持しています。そうすれば、特定のバージョンに準拠するオブジェクトを更新できます。あなたの要件はそれほど複雑ではないかもしれませんが、もしそうなら、それは確かに役立ちます。


col name height = {'unit': 'cms'、 'value':150}のようなjsonオブジェクトにこれが必要です
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;

Iは、COL名高さのようなJSONオブジェクトのためにこれを必要とする= { '部': 'CMS'、 '値':150}
ラーフルDapke
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.