Соответствие значениям столбцов и игнорирование специальных символов в PostgreSQL 11.0 - PullRequest
0 голосов
/ 03 августа 2020

У меня есть следующая таблица в PostgreSQL 11.0

name                                            identifier  name_matched
anti-angin® formula                             3792673     anti angin
anti-angin® formula                             3792673     anti angin
arava® 20 mg tablets                            D25155      arava 20 mg
nifedipine extended release tablets 60 mg       23766       nifedipine

Я использую следующий запрос для сопоставления значений name и name_matched.

select * from tbl
where name ilike '%' || name_matched || '%' 

Вышеупомянутый запрос дает только row4 в качестве вывода. Как изменить запрос, чтобы получить все четыре строки (игнорируя специальные символы, а затем сопоставляя строки)

Любая помощь приветствуется

Ответы [ 2 ]

1 голос
/ 03 августа 2020
select * from tbl
where
  array(select x[1] from regexp_matches(name_matched, '([a-zA-Z0-9]+)', 'g') as x) <@
  array(select x[1] from regexp_matches(name, '([a-zA-Z0-9]+)', 'g') as x);

или, чтобы сделать его короче:

create function regexp_matches_array(astr text, apattern text)
  returns text[]
  language sql
  immutable
  strict
as $func$
  select array_agg(x[1]) from regexp_matches(astr, apattern, 'g') as x
$func$

select * from tbl
where
  regexp_matches_array(name_matched, '([a-zA-Z0-9]+)') <@
  regexp_matches_array(name, '([a-zA-Z0-9]+)');

Обратите внимание, что при этом не учитывается порядок слов.

0 голосов
/ 03 августа 2020

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

select *
  from tbl
 where replace(regexp_replace(name, '[^A-Za-z0-9 -]', ''), '-', ' ') ~*
       replace(regexp_replace(name_matched, '[^A-Za-z0-9 -]', ''), '-', ' ')
;

...