Postgres & JSONB - аргумент Левенштейна - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть две таблицы, и я хочу выполнить левое соединение со второй по первую с помощью алгоритма нечеткого сопоставления Левенштейна.Таблица ita_public содержит данные jsonb, и выполняется сопоставление между строкой (имя_поставщика) и некоторыми вложенными данными в строке json.

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 
priv.*,
pub.info::json->>'name' as match_org_name,
pub.info::json->'locations'->'items'-> 0 ->'address'->>'streetName'

FROM ita_sn_private as priv
LEFT JOIN ita_public as pub
ON ((levenshtein(priv.supplier_name, pub.info::json->>'name') < 3))

Однако я получаю ошибку:

ОШИБКА: аргумент Левенштейна превышает максимальную длину в 255 символов Состояние SQL: 22023

Может кто-нибудь помочь с этим?Я ничего не могу найти в интернете по этому поводу.Я создал тестовые таблицы и тестовые данные, и запрос работал нормально, но в моем исходном наборе данных это не так.

1 Ответ

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

С документация :

Левенштейн (источник текста, цель текста) возвращает int

И источником, и целью может быть любая ненулевая строка,максимум 255 символов.

Вы можете попробовать:

ON ((levenshtein(left(priv.supplier_name, 255), left(pub.info::json->>'name', 255)) < 3))
...