我有2个公司和联系人表。联系人已解决JSONB列。 我尝试使用contacts.linked_to_company并使用jsonb_array_elements(company.addresses)连接的select语句,但是我收到错误'无法从标量中提取元素',我理解这是因为某些条目在列地址中确实有[null]。我已经看到了使用coalesce或CASE语句的答案。 Coalesce我可能无法工作,CASE示例在select语句中如何在连接中使用它? 这是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"}]}]
答案 0 :(得分:1)
你可以尝试其中一种(而不是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()
。