1

I am trying to use jsonb_set to change a single attribute of a jsonb object within my Postgres table.

I am using WITH random_string AS to set the variable random_string to a random hexidecimal value and then pass that string into my UPDATE query. However, it is not working.

This is the code I am using:

WITH random_string AS (SELECT  substr(md5(random()::text), 0, 25)::varchar)

UPDATE 
    teams 
SET 
    profile = jsonb_set(profile, '{api_key}', random_string)
WHERE
    team_id="abc123";

The error I get seems to think I am trying to access a column that does not exist, because this is how you would normally reference a column.

Postgres query failed, PostgresPlugin query failed to execute: error: column "random_string" does not exist

Question: How do I use my random_string variable in the jsonb_set function to update this attribute?

Oscar Chambers
  • 899
  • 9
  • 25
  • related post: https://stackoverflow.com/questions/26703476/how-to-perform-update-operations-on-columns-of-type-jsonb-in-postgres-9-4 – jian Nov 17 '22 at 16:41

1 Answers1

1

Three issues. First, WITH statement gives a table-like result, not a variable. Define a table with a single column and use its name in the FROM clause in UPDATE. Next, the third argument of jsonb_set() is jsonb, use to_jsonb(). And last, a proper text literal is in single quotes 'abc123'.

WITH var(random_string) AS (SELECT substr(md5(random()::text), 0, 25)::varchar)

UPDATE 
    teams 
SET 
    profile = jsonb_set(profile, '{api_key}', to_jsonb(random_string))
FROM
    var
WHERE
    team_id = 'abc123';
klin
  • 112,967
  • 15
  • 204
  • 232