首页 > 解决方案 > 使用正则表达式查找与 Oracle 表匹配的字符串

问题描述

我在接收 company_name 输入的 Oracle 12c 数据库上有一个 Oracle 存储过程。从那个 company_name 中,我需要找到并标记联邦机构。为此,我有一个表 (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 将传入的 company_name 与 TBL_FED_KEY.KEY_1 进行匹配?我已经尝试了 REGEXP_INSTR 的多种变体,但我似乎无法让任何东西 100% 工作。REGEXP_INSTR 甚至是完成此任务的最佳工具吗?

谢谢!

标签: sqlregexoraclematchoracle12c

解决方案


我不确定该程序在将公司“标记”为联邦与非联邦之后应该做什么。相反,我会将其编写为如下所示的函数(但如果需要,您可以轻松地在过程中重用大部分代码)。

然后我说明如何在 SQL 中直接使用该函数。如果需要,您也可以在 PL/SQL 中使用它,但在大多数情况下您不需要。注意 - 相同的想法可以专门在 SQL 中实现,从而加快执行速度,因为您根本不需要 PL/SQL。重要 - 即使在普通 SQL 中,这也应该通过连接来实现,正如我所演示的那样,以便更快地执行。

设置

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  

如您所见,我提出了一些误报- 以说明这个“技术”解决方案只是部分的重要事实。如果准确性很重要,人类仍然需要查看单个命中。


推荐阅读