Обновить поле JSON в соответствии с номером строки в postgres - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть таблица 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 должен быть уникальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...