无法从标量中提取元素

cannot extract elements from a scalar

我有 2 表公司和联系人。联系人具有地址 JSONB 列。 我尝试了一个 select 语句,在 contacts.linked_to_company 上加入并使用 jsonb_array_elements(company.addresses) 但我得到错误 'cannot extract elements from a scalar' 我的理解是因为有些条目确实有[null] 在列地址中。我已经看到使用 coalesce 或 CASE 语句的答案。合并我可能无法工作,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"}]}]

您可以尝试其中之一(而不是 jsonb_array_elements(t.addresses) address):

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

第一个隐藏列格式不正确 json 的行,第二个为它们提供 null

然而,问题实际上源于列中的一个或多个值不是json数组。您可以使用以下命令轻松修复它:

update contact
set addresses = '[null]' 
-- or
-- set addresses = '[{"PostCode": null}]'
where jsonb_typeof(addresses) <> 'array' or addresses = '[]';

此更正后,您将不再需要 jsonb_array_elements() 中的 case