PostgreSQL UPDATE столбец из значения JSONB - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть таблица postgresql, в которой есть столбец, содержащий данные jsonb для строки. Не все данные были извлечены из jsonb для создания таблицы, но мы хотели сохранить ее на случай, если нам потребуется извлечь больше данных.

Теперь нам нужно вытащить еще одно поле из jsonb в строке и создать новый столбец для хранения значения. Примеры, которые я видел, похоже, не касаются этого конкретно, поэтому я хочу дважды проверить свой процесс и посмотреть, есть ли более простой способ сделать это в PostgreSQL.

Моя инструкция вставки выглядит следующим образом:

insert into companyTable (company_id)
    select company_object ->>'CompanyId'
        from companyTable

Затем следует извлечь значение из jsonb company_obejct и вставить в столбец company_id для каждой строки в таблице. Выглядит ли это правильно, и это более простой способ выполнить эту задачу?

UPDATE: Учитывая утверждение @ Łukasz Kamiński, кажется, что я хочу UPDATE не вставлять, поскольку INSERT добавляет новую строку, и я просто хочу обновить строку, в которую был добавлен новый столбец. При этом я считаю, что это код, который я должен использовать.

update companyTable
set (company_id) =
    (select company_object ->>'CompanyId'
        from company.company)

Кроме того, поскольку я не полностью понимаю контекст UPDATE, следует ли поместить его в цикл, чтобы он обновлял каждую строку с этим объектом jsonb строк?

например (до обновления):

id | col1 | company_object           | company_id
---|------|--------------------------|------------
1  | a    |{'b':1, 'company_id': 3}  |  NULL
2  | a    |{'b':2, 'company_id': 4}  |  NULL
3  | a    |{'b':3, 'company_id': 5}  |  NULL

(после обновления)

id | col1 | company_object           | company_id
---|------|--------------------------|------------
1  | a    |{'b':1, 'company_id': 3}  |  3
2  | a    |{'b':2, 'company_id': 4}  |  4
3  | a    |{'b':3, 'company_id': 5}  |  5

1 Ответ

1 голос
/ 15 апреля 2019

Для этого вам не нужен дополнительный выбор:

update companyTable
  set company_id = (company_object ->>'company_id')::int;

Если JSON содержит пустые строки, их необходимо «обнулить»:

update companyTable
  set company_id = nullif(trim(company_object ->>'company_id'), '')::int
where company_object ? 'company_id';

Онлайн пример: https://rextester.com/UXQKG95245

Поскольку предложение where не предоставлено, это обновит все строки в таблице.


Однако я не вижу причины дублировать эту информацию. Либо сохраняйте его в столбце company_id, либо сохраняйте в значении JSON, но его дублирование, скорее всего, является плохой идеей, поскольку это может быть довольно несинхронно.

Создание представления может быть лучшим способом сделать это значение легко доступным:

create view company_information
as
select id, col1, company_object, 
       company_object ->> 'company_id' as company_id
from company_table;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...