我有 2 张表公司和联系人。联系人具有地址 JSONB 列。
我尝试使用 contact.linked_to_company 上的连接并使用 jsonb_array_elements(company.addresses) 进行 select 语句,但收到错误“无法从标量中提取元素”,我理解这是因为某些条目在列地址中确实有 [null] 。我已经看到使用合并或 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 = '[]';
进行此更正后,您将不需要case
in jsonb_array_elements()
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)