อัพเดตองค์ประกอบ 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}
Rahul Dapke
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.