У меня есть таблица data
, где есть столбец userdata
типа jsonb. Сохраненная json имеет структуру:
{"address": "abc", "phone":123, "uname":"xyz"}
Теперь в моей таблице есть несколько записей userdata
, и некоторые из них содержат поле uname
пусто. Примерно так:
{"address": "abc", "phone":123, "uname":""}
Я бы хотел обновить uname
в JSON везде, где он пуст, и установить его в качестве номера строки этой записи. Например, если строки № 5 и 10 содержат JSON {"address": "abc", "phone":123, "uname":""}
и {"address": "def", "phone":456, "uname":""}
, я бы хотел обновить их до {"address": "abc", "phone":123, "uname":"5"}
и {"address": "def", "phone":456, "uname":""}
соответственно.
Я пытался сделать это с jsonb_set
и row_number()
следующим образом:
UPDATE wx.data SET userdata=jsonb_set(userdata, '{uname}', concat('"', (SELECT ROW_NUMBER() OVER (ORDER BY id) FROM wx.data WHERE (userdata->>'uname')=''), '"')::jsonb, false) WHERE (userdata->>'uname')='';
Но это неправильно, поскольку подзапрос возвращает несколько значений. Я не могу понять, как установить uname
для соответствующих значений строки.
РЕДАКТИРОВАТЬ: Одно ограничение заключается в том, что uname
должен быть уникальным.