Оператор не существует - Postgres & JSON Select Query - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь извлечь и объединить данные из таблицы, содержащей данные 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 ЛИНИЯ 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?Я не уверен, как их приравнять.

1 Ответ

0 голосов
/ 07 декабря 2018

Причиной является условие соединения:

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

-> возвращает объект JSON, а не строку.Вам нужно использовать ->> там

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

так же, как вы использовали в WHERE предложении

...