У меня следующий сбой с Postgres:
Я пытаюсь массово исправить названия улиц, которые поставляются с разными орфографическими ошибками. Например, я пытаюсь исправить таблицу адресов с ошибками, где «Главная улица» отображается в трех формах - «Главная улица», «Главная улица» и «М. Улица».
Для этого яесть таблица с двумя столбцами, назовем ее STREGEX.
Первый столбец называется official_street_name и содержит стандартное название улицы («Главная улица»). В столбце 2 содержится отдельное регулярное выражение для названия каждой улицы (например, «(M | m) (. | Ain) (- | \ s) (S | s) tr (. | Eet)»), предназначенное для определения как можно большего количества различных вариантов написания. насколько это возможно. Последний столбец, содержащий регулярные выражения названий улиц, называется stregex_column, а вся таблица содержит около 13 тыс. Названий улиц.
Итак, что я делаю в SQLITE, так это запускаю столбец regexp для столбцов с ошибками и обновляю формализованные имена,
Например, скажем, я хочу обновить таблицу с названием street_correction и иметь два столбца: «неправильное_имя_имя» и столбец_2 «исправленное_стечение_имя». Первый содержит уличные намены с ошибками, а последний - ноль.
update street_correction
set corrected_street_name =
(select official_street_name
from stregex where
wrong_street_name regexp '^' || stregex || '$')
)
Приведенный выше код прекрасно работает в SQLITE, но я перешел к Postgres, используя:
update street_correction
set corrected_street_name =
(select official_street_name
from stregex where
wrong_street_name ~* '^' || stregex_column || '$')
Я только что обменял «regexp» (SQLITE) на «~ *» (Postgres). Postgres возвращает ошибку:
> ERROR: operator does not exist: boolean || stregex
> LINE 6: wrong_street_name ~* '^' || stregex_column || '$')
> ^
> HINT: No operator matches the given name and argument types. You might need to add explicit type casts.
Или я использовал команду:
select * from street_correction, stregex
where wrong_street_name ~* '^' || stregex_column || '$'
и возвращает ошибку:
> ERROR: argument of WHERE must be type boolean, not type text
> LINE 2: where wrong_street_name ~* '^' || stregex_column || '$'
> ^
> SQL state: 42804
> Character: 49
Как использовать столбецсодержащие регулярные выражения в Postgres? Эта логическая ошибка разрешима?
Для справки:
create table stregex (official_street_name text, stregex_column text)
;
insert into stregex values
('Main Street', '(M|m)(.|ain)(-|\s)(S|s)tr(.|eet)')
;
create table street_correction (wrong_street_name text, corrected_street_name text)
;
insert into street_correction (wrong_street_name)
values
('main Street'),
('Main-Street'),
('M. Street')
;
select * from street_correction
;
select * from stregex
;
update street_correction
set corrected_street_name =
(select official_street_name
from stregex where
wrong_street_name ~* '^' || stregex_column || '$')