Sql 使用正则表达式查找与Oracle表匹配的字符串

Sql 使用正则表达式查找与Oracle表匹配的字符串,sql,regex,oracle,match,oracle12c,Sql,Regex,Oracle,Match,Oracle12c,我在Oracle 12c数据库上有一个Oracle存储过程,该数据库接收公司名称输入。从那家公司的名字,我需要找到并标记联邦机构。为了实现这一点,我有一个表(TBL_FED_KEY),其中有一列关键字(KEY_1)。该表包含近50个值,如: ARMY FEDERAL AIR FORCE VETERANS HOMELAND SECURITY INDIAN HOSPITAL WILL ROGERS 为了让您了解可以传递到过程的c

我在Oracle 12c数据库上有一个Oracle存储过程,该数据库接收公司名称输入。从那家公司的名字,我需要找到并标记联邦机构。为了实现这一点,我有一个表(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\U FED\U KEY.KEY\U 1进行匹配?我尝试了多种不同的REGEXP_INSTR,但似乎无法100%地实现任何功能。REGEXP_INSTR是实现这一目标的最佳工具吗


谢谢

您可以像使用
一样使用

select f.*
from TBL_FED_KEY f
where lower(i.name) like '%' || lower(KEY_1) || '%'

您可以像使用
一样使用

select f.*
from TBL_FED_KEY f
where lower(i.name) like '%' || lower(KEY_1) || '%'

似乎您希望在这些字符串之间进行不区分大小写的匹配。因此,将
REGEXP_LIKE()
函数与不区分大小写(
i
)选项一起使用:


似乎您希望在这些字符串之间进行不区分大小写的匹配。因此,将
REGEXP_LIKE()
函数与不区分大小写(
i
)选项一起使用:


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

然后,我将说明如何在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;
/
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  
功能代码

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;
/
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  
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;
/
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  

如您所见,我添加了一些误报,以说明这一“技术”解决方案只是部分解决方案这一重要事实。如果准确度很重要的话,一个人仍然需要检查个人点击量。

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

然后,我将说明如何在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;
/
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  
功能代码

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;
/
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  
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;
/
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  

如您所见,我添加了一些误报,以说明这一“技术”解决方案只是部分解决方案这一重要事实。如果准确度很重要,人类仍然需要查看单个点击。

那么您的意思基本上是,您收到一个全名,然后在该参数内的
KEY_1
中搜索一些关键字?恐怕这里的问题与Oracle或正则表达式无关,但大多是1:1的“关系”。
'%'| | KEY_1 | |'%'
真的会用每个可能的参数映射1:1吗?因为要比较的字符串是固定字符串,没有哪个REGEXP函数是最优的;您可以使用标准字符串函数和比较运算符(如INSTR等)完成所有操作。(如果关键字可能包含下划线或百分比符号,说明可能比LIKE更好。)尽管如此,您只需要知道输入字符串是否与至少一个关键字和短语匹配吗?或者你需要知道有多少,和/或哪些?答案对于问题的有效解决非常重要。因此,您的意思基本上是,您收到一个全名,然后在此参数内搜索
KEY_1
中的一些关键字?恐怕这里的问题与Oracle或正则表达式无关,但大多是1:1的“关系”。
'%'| | KEY_1 | |'%'
真的会用每个可能的参数映射1:1吗?因为要比较的字符串是固定字符串,没有哪个REGEXP函数是最优的;您可以使用标准字符串函数和比较运算符(如INSTR等)完成所有操作。(如果关键字可能包含下划线或百分比符号,说明可能比LIKE更好。)尽管如此,您只需要知道输入字符串是否与至少一个关键字和短语匹配吗?或者你需要知道有多少,和/或哪些?答案对于有效解决这个问题很重要。