Perbarui elemen json dalam tipe data json

14

Saya tidak tahu bagaimana cara memperbarui elemen dalam tipe data PostgreSQL 9.3.

Contoh saya:

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;

Bagian json di "profil"

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

Saya menggunakan x-edit untuk frontend, dan saya berharap sesuatu seperti ini akan berhasil, tetapi tidak:

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

Sepertinya saya tidak dapat menemukan informasi tentang cara memperbarui tipe data json.

Sebastien Deschamps
sumber

Jawaban:

7

Karena ini hanya sebuah string, Anda mungkin dapat melakukan perubahan / penghapusan sederhana dari sebuah simpul dengan regex_replacefungsi tersebut.

Sebagai contoh, ini adalah bagaimana saya baru-baru ini menghapus simpul JSON tertentu dalam sebuah tabel (semua baris):

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

Catatan, untuk semua data JSON saya, saya menyimpan "version":"(n).(n)"simpul (yaitu versi skema) di objek. Dengan begitu saya bisa memperbarui objek yang sesuai dengan versi tertentu. Persyaratan Anda mungkin tidak serumit itu, tetapi jika memang demikian, tentu membantu.

MikeM
sumber
Saya memerlukan ini untuk objek json seperti col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke
3

Saya pikir Anda harus Memperbarui bidang lengkap pada Postgres 9.3, setidaknya inilah yang dikatakan oleh dokumentasi kepada saya.

Memperbarui setiap elemen dalam dokumen JSON akan menjadi 9,4 jika saya tidak salah.

frlan
sumber
2

Coba ini

UPDATE Tablename
SET columnname = replace(columnname::TEXT,'"name":','"my-other-name"')::jsonb 
WHERE id = 1;
Er.Chetan wagh
sumber
Saya memerlukan ini untuk objek json seperti col name height = {'unit': 'cms', 'value': 150}
Rahul Dapke