18

I can't figure how can I update an element in a PostgreSQL 9.3 datatype.

My example:

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;

The json part in "profiles"

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

I'm using x-edit for the frontend, and I was hoping that something like this would work, but it doesn't:

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

I can't seem to find any information on how to update a json datatype.

Paul White
95.3k30 gold badges439 silver badges689 bronze badges
asked Dec 8, 2013 at 16:56

3 Answers 3

9

Since it's just a string, you might be able to accomplish a simple change/deletion of a node with the regex_replace function.

For example, this is how I recently deleted a certain JSON node in a table (all rows):

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

Note, for all my JSON data, I keep a "version":"(n).(n)" (i.e. schema version) node in the object. That way I can update objects that comply with a specific version. Your requirements may not be that complex, but if they are, it certainly helps.

Paul White
95.3k30 gold badges439 silver badges689 bronze badges
answered Aug 11, 2014 at 1:50
1
  • I need this for json object like col name height= {'unit':'cms','value':150} Commented Dec 12, 2019 at 11:30
5

Try This

UPDATE Tablename
SET columnname = replace(columnname::TEXT,'"name":','"my-other-name"')::jsonb 
WHERE id = 1;
answered May 3, 2017 at 10:20
1
  • I need this for json object like col name height= {'unit':'cms','value':150} Commented Dec 12, 2019 at 11:29
3

I think you will have to Update the complete field on Postgres 9.3, at least this is what the documentation is telling me.

Updating individual elements in a JSON document will be in 9.4 if I'm not mistaken.

Paul White
95.3k30 gold badges439 silver badges689 bronze badges
answered Dec 10, 2013 at 10:00
0

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.