首页 > 解决方案 > 运算符不存在 - Postgres 和 JSON 选择查询

问题描述

我正在尝试从包含 JSONB 数据的表中检索和连接数据,其中 JSON 行的格式为:

{
    "id": "d57929b35216",
    "base" : {"legalName" : "SAPI S.P.A."}, 
    "name": "SAPI S.P.A.", 
}

表 ita_public

CREATE TABLE public.ita_public
(
    id integer NOT NULL DEFAULT nextval('ita_data_id_seq'::regclass),
    info jsonb NOT NULL,
    CONSTRAINT ita_data_pkey PRIMARY KEY (id)
)

表 ita_sn_private

CREATE TABLE public.ita_sn_private
(
    id integer NOT NULL DEFAULT nextval('ita_sn_private_id_seq'::regclass),
    supplier_name character varying COLLATE pg_catalog."default",
    supplier_streetadd character varying COLLATE pg_catalog."default",
    CONSTRAINT ita_sn_private_pkey PRIMARY KEY (id)
)

SELECT 查询打印三列,连接供应商名称和嵌套名称并搜索名称:

SELECT
priv.supplier_name,
priv.supplier_streetadd,
pub.info::json->'base'->'legalName'

FROM ita_sn_private as priv 
JOIN ita_public as pub ON (priv.supplier_name = pub.info::json->'name')

WHERE pub.info::json->>'name' = 'SAPI S.P.A.'

我得到错误:

错误:运算符不存在:

字符变化 = json LINE 7: 加入 ita_public 作为 pub ON (priv.supplier_name = pub.info::js...

提示:没有运算符与给定名称和参数类型匹配。您可能需要添加显式类型转换。

('='下面的小帽子)

我试图简化查询以确保我的 json 路径正确:

SELECT
info::json->'base'->'legalName'
FROM
ita_public
WHERE info::json->>'name' = 'SAPI S.P.A.'

哪个工作正常。

任何人都可以协助 JOIN 声明吗?我不确定如何将两者等同起来。

标签: jsonpostgresqljsonb

解决方案


加入条件是原因:

on priv.supplier_name = pub.info::json->'name'

->返回 JSON 对象,而不是字符串。你需要在->>那里使用

on priv.supplier_name = pub.info::json->>'name'

与您在WHERE条款中所做的相同


推荐阅读