не может извлечь элементы из скаляра - PullRequest
0 голосов
/ 11 мая 2018

У меня 2 таблицы компании и контакты.Контакты имеют адреса в столбце JSONB.Я попытался выбрать оператор с соединением для contacts.linked_to_company и с помощью jsonb_array_elements (company.addresses), но я получаю сообщение об ошибке «не удается извлечь элементы из скаляра», что, как я понимаю, связано с тем, что в некоторых записях есть [null] в адресе столбца.Я видел ответы, чтобы использовать coalesce или оператор CASE.Объединение Я могу получить не работать, и пример CASE находится в операторе выбора, как использовать его в соединении?Вот sql

SELECT company.id,
trading_name, 
nature_of_business, 
t.id contactID, 
address->>'PostCode' Postcode,
position_in_company
FROM contact t FULL JOIN company ON (t.company_linked_to = company.id ),
jsonb_array_elements(t.addresses) address
  WHERE
 t.company_linked_to ='407381';

вот пример jsonb

[{"PostCode":"BN7788","Address":"South Street","AddressFull":"","Types":[{"Type":"Collection"}]}]

1 Ответ

0 голосов
/ 11 мая 2018

Вы можете попробовать один из них (вместо jsonb_array_elements(t.addresses) address):

jsonb_array_elements(case jsonb_typeof(addresses) when 'array' then addresses else '[]' end) address
-- or
jsonb_array_elements(case jsonb_typeof(addresses) when 'array' then addresses else '[{"PostCode": null}]' end) address

Первый скрывает строки с неправильным форматом столбца json, второй дает для них null.

Однако проблема фактически заключается в том, что одно или несколько значений в столбце не являются массивом json. Вы можете легко исправить это с помощью команды:

update contact
set addresses = '[null]'
where jsonb_typeof(addresses) <> 'array' or addresses = '[]';

После этого исправления вам не понадобится case в jsonb_array_elements().

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