不能从标量中提取元素

时间:2018-05-11 15:58:57

标签: sql json postgresql

我有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"}]}]

1 个答案:

答案 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()