Найти совпадение строки с таблицей Oracle с помощью регулярных выражений - PullRequest
1 голос
/ 28 апреля 2020

У меня есть хранимая процедура Oracle в базе данных Oracle 12 c, которая получает входные данные company_name. Из этого названия компании мне нужно найти и пометить федеральные учреждения. Для этого sh у меня есть таблица (TBL_FED_KEY) с одним столбцом (KEY_1) ключевых слов. Таблица содержит почти 50 значений, таких как:

ARMY     
FEDERAL     
AIR FORCE     
VETERANS     
HOMELAND SECURITY     
INDIAN HOSPITAL     
WILL ROGERS     

Чтобы дать вам представление о строке company_name, которую можно передать процедуре, вот примеры:

US Army - Munson  Health Center     
Federal Bureau of Prisons,BOP/DOJ-     
Hickam Air Force Base Pharmacy     
Minnesota Veterans Home Pharmacy     
P.H.S. Indian Hospital     
Will Rogers Health Center     

Что Oracle SQL можно использовать для сопоставления входящего имени компании с TBL_FED_KEY.KEY_1? Я пробовал несколько вариантов REGEXP_INSTR, но я не могу заставить что-либо работать на 100%. REGEXP_INSTR - даже лучший инструмент для выполнения sh этого?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 28 апреля 2020

Кажется, вы хотите, чтобы среди этих строк не учитывалось регистр символов. Итак, используйте функцию REGEXP_LIKE() с параметром без учета регистра (i):

SELECT *
  FROM TBL_FED_KEY
 WHERE REGEXP_LIKE(company_name,key_1,'i')
0 голосов
/ 28 апреля 2020

Я не уверен, что процедура должна делать после того, как она "помечает" компанию как федеральную, а не как. Вместо этого я написал бы ее как функцию, как показано ниже (но вы можете легко использовать большую часть кода в процедуре, если это необходимо).

Затем я продемонстрирую, как функция может использоваться непосредственно в SQL. Вы также можете использовать его в PL / SQL, если это необходимо, но в большинстве случаев это не так. Примечание: та же идея может быть реализована исключительно в SQL, что приводит к более быстрому выполнению, так как вам совсем не нужен PL / SQL. Важно - даже в простом SQL это должно быть реализовано через semi соединение, как я продемонстрировал, для более быстрого выполнения.

Setup :

create table tbl_fed_key (key_1 varchar2(200));

insert into tbl_fed_key
  select 'ARMY'              from dual union all
  select 'FEDERAL'           from dual union all
  select 'AIR FORCE'         from dual union all
  select 'VETERANS'          from dual union all
  select 'HOMELAND SECURITY' from dual union all
  select 'INDIAN HOSPITAL'   from dual union all
  select 'WILL ROGERS'       from dual
;

commit;

Код функции :

create or replace function is_federal_institution(company_name varchar2)
  return varchar
  deterministic
as
  is_fed varchar2(1);
begin
  select case when exists ( select key_1 
                            from   tbl_fed_key
                            where  instr(upper(company_name), upper(key_1)) > 0
                          )
              then 'Y' else 'N' end
    into is_fed
    from dual;
  return is_fed;
end;
/

SQL тест :

with
  inputs (str) as (
    select 'Joe and Bob Army Supply Store' from dual union all
    select 'Mary Poppins Indian Hospital'  from dual union all
    select 'Bridge Association of NYC'     from dual union all
    select 'Will Rogers Garden'            from dual union all
    select 'First Federal Bank NA'         from dual
  )
select str, is_federal_institution(str) as is_federal
from   inputs
;

STR                            IS_FEDERAL
------------------------------ ----------
Joe and Bob Army Supply Store  Y         
Mary Poppins Indian Hospital   Y         
Bridge Association of NYC      N         
Will Rogers Garden             Y         
First Federal Bank NA          Y  

Как видите, я бросил в нескольких ложных срабатываниях - для иллюстрации важного факта, что это "технологическое" решение является лишь частичным. Человек все равно должен будет просмотреть отдельные попадания, если важна точность.

0 голосов
/ 28 апреля 2020

Вы можете просто использовать like:

select f.*
from TBL_FED_KEY f
where lower(i.name) like '%' || lower(KEY_1) || '%'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...