Sql 使用正则表达式查找与Oracle表匹配的字符串
我在Oracle 12c数据库上有一个Oracle存储过程,该数据库接收公司名称输入。从那家公司的名字,我需要找到并标记联邦机构。为了实现这一点,我有一个表(TBL_FED_KEY),其中有一列关键字(KEY_1)。该表包含近50个值,如: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
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更好。)尽管如此,您只需要知道输入字符串是否与至少一个关键字和短语匹配吗?或者你需要知道有多少,和/或哪些?答案对于有效解决这个问题很重要。