【问题标题】:cannot extract elements from a scalar无法从标量中提取元素
【发布时间】:2022-05-19 18:42:11
【问题描述】:

我有 2 张表公司和联系人。联系人有地址 JSONB 列。 我尝试了一个 select 语句,在 contacts.linked_to_company 上加入并使用 jsonb_array_elements(company.addresses) 但我收到错误“无法从标量中提取元素”,我理解这是因为某些条目在列地址中确实有 [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"}]}]

【问题讨论】:

    标签: sql arrays json postgresql jsonb


    【解决方案1】:

    您可以尝试其中一种(而不是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 中的jsonb_array_elements() 将不再需要。

    【讨论】:

    • 感谢您的回答,如果我想从 jsonb 检索所有信息,即 Address、AddressFull,如果没有有效的“数组”,jsonb 中的每个字段是否都必须在 ELSE 语句中为空?
    • 数据校正是更好的解决方案,请参阅更新后的答案。
    • 我正在寻找的答案!帮助解决 Postgresql 10 更新引起的案例问题和 SRF。将案例移动到 jsonb_array_elements 内部而不是外部。还可以参考其他路人的博客:tapoueh.org/blog/2017/10/…
    猜你喜欢
    • 2020-10-06
    • 2020-11-14
    • 2017-01-07
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2017-02-10
    • 2010-10-04
    • 1970-01-01
    相关资源
    最近更新 更多