I have a table like this;
CREATE TABLE test (
id BIGSERIAL PRIMARY KEY,
data JSONB
);
INSERT INTO test(data) VALUES(\'[1,2,\"a\",4,\"8\",6]\'); -- id =
You cannot manipulate selected elements of a json
/ jsonb
type directly. Functionality for that is still missing in Postgres 9.4 (see @Craig's comment). You have to do 3 steps:
To replace the 3rd element of the json array (data->3
) in the row with id = 1
with a given (new) value ('
) in pg 9.4:
UPDATE test t
SET data = t2.data
FROM (
SELECT id, array_to_json(
array_agg(CASE WHEN rn = 1 THEN '' ELSE elem END))
) AS data
FROM test t2
, json_array_elements_text(t2.data) WITH ORDINALITY x(elem, rn)
WHERE id = 1
GROUP BY 1
) t2
WHERE t.id = t2.id
AND t.data <> t2.data; -- avoid empty updates
About json_array_elements_text()
:
About WITH ORDINALITY
: