Как я могу использовать весь * столбец *, содержащий регулярные выражения в Postgres? - PullRequest
0 голосов
/ 03 ноября 2019

У меня следующий сбой с 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 || '$')

1 Ответ

0 голосов
/ 03 ноября 2019

Используйте круглые скобки:

update street_correction sc
    set corrected_street_name = (select s.official_street_name 
                                 from stregex s
                                 where sc.wrong_street_name ~* ('^' || s.stregex_column || '$')
                                );

Вы также можете быть осторожны с подзапросом, возвращающим несколько значений. Это может произойти, если нескольким регулярным выражениям соответствует одно неверное название улицы.

Ваш код анализируется как:

(sc.wrong_street_name ~* '^') || s.stregex_column || '$'

, поэтому вы получаете эту ошибку.

...