How to update an element in json array with where clause? I came across this question on how to update nth element of array, but it has nested json values in it instead of a plain array of strings. 

Here are some sample json values from jsonb column of the table.

{"pattern": {"values": ["foo", "edfgh"]}}
{"pattern": {"values": ["abc", "abdhi", "foo"]}}
{"pattern": {"values": ["these", "abcd", "para", "avil"]}}


We can select the nth element using

select data #&gt; '{pattern, values, 0}' from table;


How can we loop through array and update foo to bar if it is present in that array?
You can use a query like the one below;

UPDATE table SET
  data = jsonb_set(data,'{pattern, values}', ((data-&gt;'pattern'-&gt;'values') - 'foo') ||  '["bar"]' )
WHERE
  (data #&gt; '{pattern, values}') ? 'foo';


Details; 

First you have to find records which have "foo" value in "values" array;

(data #&gt; '{pattern, values}') ? 'foo'


After that remove the value "foo" from the array;

((data-&gt;'pattern'-&gt;'values') - 'foo')


Create a new array by concatenating your new value(s).

((data-&gt;'pattern'-&gt;'values') - 'foo') ||  '["bar"]'


Replace new array with the old one.

jsonb_set(data,'{pattern, values}', new_array)