@doriulbool

Как заменить текст значения в запросе sql во время поиска?

Имеется две таблицы.

Первая:

Name_short | Value
АО "СЗП" | 10

Вторая:

Name_full
Акционерное общество "Саранский завод Пупкина"

Говорю сразу - Был бы id можно было сделать джоин по нему, но его нет.
Входные данные для поиска: АО "Саранский завод Пупкина"

Мы ничего не найдем, не по первой, не по второй таблице.

Возможно ли, например, во время поиска подменять слова на слова из списка, например:

Spisok=([ао; акционерное общество],[зао;закрытое акционерное общество],[ооо;общество с ограниченной ответственностью]);

Ищем:
АО "Саранский завод Пупкина"

Не находим и поменяем во время поиска АО на полное наименование
Профит
Дело в том, что отрубать начало нельзя и искать чисто по наименованию без правовой формы так как, будут выдаваться невалидные названия типа ЗАО или ОА из-за вхождения АО в эти слов.

В sql со списками, массивами и переменными не знаком, от сюда и перебрать данные у меня не получается. Функцию Replace делать умею, но получается конструкция типо запроса в запросе, да еще и 'ао', как буквы в слове могут встречаться. Есть идеи?
  • Вопрос задан
  • 405 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rickkk
@Rickkk
Посмотрел задачу. Мне кажется, что эта проблема решается с использованием таблицы соответствий полных и коротких правовых форм. Вот скрипт:

--таблица с заводами
create table test_tbl 
(
Name_full text
);

insert into test_tbl 
select 'Акционерное общество "Саранский завод Пупкина"';



--таблица соответствий правовых форм
create table prav_forms 
(
short_form text,
full_form text
);

--заполняем таблицу
insert into prav_forms(short_form,full_form)
select 'ао','акционерное общество'
union
select 'зао','закрытое акционерное общество'
union 
select 'ооо','общество с ограниченной ответственностью';


--выходной запрос

with ish as(
--что ищем
select 'ао "Саранский завод Пупкина"'::text  as search_str
),
ish2 as (
--получаем форму и завод регулярками
select (regexp_matches(search_str, '(\w+)'))[1] as form,
(regexp_matches(search_str, '\"[\w\s]+\"'))[1] as form2
 from ish
)
,
ish3 as (
--находим запись по короткому наименованию 
select * from test_tbl where lower(Name_full)=(select lower(search_str) from ish limit 1)
)
--выборка
select * from ish3
union
--если по короткому не найдено, то получаем полную форму и ищем по ней
select * from test_tbl tt
where not exists(select * from ish3)
and lower(tt.Name_full) in (select 
lower(pv.full_form || ' ' || ish2.form2)
 from ish2 inner join prav_forms pv on 
lower(pv.short_form)=lower(ish2.form)
limit 1
);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы