Sql 检查另一个字符串中是否存在字符串变体
我需要检查部分名称是否与全名匹配。例如:Sql 检查另一个字符串中是否存在字符串变体,sql,regex,oracle,Sql,Regex,Oracle,我需要检查部分名称是否与全名匹配。例如: Partial_Name | Full_Name -------------------------------------- John,Smith | Smith William John Eglid,Timothy | Timothy M Eglid 我不知道如何进行这种匹配 另一件事是,名字和姓氏可能出现错误的顺序,使它更难 我可以这样做,但这只适用于名称顺序相同且100%匹配的情况 decode(小写(REGEXP\u RE
Partial_Name | Full_Name
--------------------------------------
John,Smith | Smith William John
Eglid,Timothy | Timothy M Eglid
我不知道如何进行这种匹配
另一件事是,名字和姓氏可能出现错误的顺序,使它更难
我可以这样做,但这只适用于名称顺序相同且100%匹配的情况
decode(小写(REGEXP\u REPLACE(部分名称,[^a-zA-Z'],'')、小写(REGEXP\u REPLACE(全名,[^a-zA-Z'],'')、“相同”、“不同”)
您可以在提供的文本上使用此模式-适用于大多数引擎
([^ ,]+),([^ ,]+)(?=.*\b\1\b)(?=.*\b\2\b)
这就是我最后要做的。。。不确定这是否是最好的方法。 我用逗号分割部分,检查名字是否以全名显示,姓氏是否以全名显示。如果两者都存在,则匹配
CASE
WHEN
instr(trim(lower(Full_Name)),
trim(lower(REGEXP_SUBSTR(Partial_Name, '[^,]+', 1, 1)))) > 0
AND
instr(trim(lower(Full_Name)),
trim(lower(REGEXP_SUBSTR(Partial_Name, '[^,]+', 1, 2)))) > 0
THEN 'Y'
ELSE 'N'
END AS MATCHING_NAMES
我将从全名创建一组标记,然后查看该标记集中是否存在一个或多个部分名模式(用逗号分隔)。一些用户可能感兴趣或不感兴趣的测试用例:对于全名“Smith William John”,“Smith”不是匹配,“Smith,Will”不是匹配,“Smith,William”不是匹配项。
将
通过使用\b
来抑制,以防止不必要的名称匹配-除非OP同意,并且Smith,William
有一个额外的空间不是“提供的文本”,我的模式与提供的示例一样好!当然这可能正是询问者想要的。我只是在为更难或更聪明的案例进行“压力测试”。
SELECT * FROM tab
WHERE instr(Partial_Name, ',') > 0
AND REGEXP_LIKE(full_name, substr(Partial_Name, 1, instr(Partial_Name, ',')-1), 'ix')
AND REGEXP_LIKE(full_name, substr(Partial_Name,instr(Partial_Name, ',')+1), 'ix')
OR instr(Partial_Name, ',') = 0
AND REGEXP_LIKE(full_name, Partial_Name, 'ix');
CASE
WHEN
instr(trim(lower(Full_Name)),
trim(lower(REGEXP_SUBSTR(Partial_Name, '[^,]+', 1, 1)))) > 0
AND
instr(trim(lower(Full_Name)),
trim(lower(REGEXP_SUBSTR(Partial_Name, '[^,]+', 1, 2)))) > 0
THEN 'Y'
ELSE 'N'
END AS MATCHING_NAMES