无法从标量中提取元素
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
。
我有 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
。