Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 检查另一个字符串中是否存在字符串变体_Sql_Regex_Oracle - Fatal编程技术网

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