Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.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
检查一列值是否包含在另一列值(TSQL)中?_Tsql_Substring - Fatal编程技术网

检查一列值是否包含在另一列值(TSQL)中?

检查一列值是否包含在另一列值(TSQL)中?,tsql,substring,Tsql,Substring,嘿,我有两个有很多列的表,我想找到那些表1.somecolumn中的值包含在表2.someothercolumn中的行。例如: 表1.1列中有史密斯、彼得和 表2.SomeOther列有peter.smith 这应该是一个匹配,我将如何做这样的搜索 谢谢:)根据您的具体需要,有几种可能的解决方案: 使用可以创建辅助表来存储每个记录的关键字 使用辅助表存储每个记录或记录和字段的关键字。例如,table_helper(id int主键、record_id int、关键字varchar)、record

嘿,我有两个有很多列的表,我想找到那些表1.somecolumn中的值包含在表2.someothercolumn中的行。例如:

表1.1列中有史密斯、彼得和
表2.SomeOther列有peter.smith

这应该是一个匹配,我将如何做这样的搜索


谢谢:)

根据您的具体需要,有几种可能的解决方案: 使用可以创建辅助表来存储每个记录的关键字

  • 使用辅助表存储每个记录或记录和字段的关键字。例如,table_helper(id int主键、record_id int、关键字varchar)、record_id-指向源表的链接。在表1、表2的触发器中填写此表。查找公共行的查询是表与自身的简单交集。您可以为表1和表2创建一个帮助器,或者使用单独的表
  • 使用全文索引

  • 您可以尝试使用
    SOUNDEX
    DIFFERENCE
    函数来帮助匹配字符串文字

    例如:

    select difference('peter.green', 'Green, Peter')
    
    返回
    2
    ,其中:

    返回的整数是 SOUNDEX值中的字符 都是一样的。返回值范围为 从0到4:0表示弱或 没有相似性,4表示强 相似性或相同的值

    请参阅和MSDN上的主题

    更新:

    Soundex&Difference在考虑单词顺序时可能无法正常工作,但如果安装了全文索引功能,则不需要创建索引来使用全文引擎的分词和解析功能。假设您使用的是SQL Server 2008,以下函数将返回标准化术语列表:

    SELECT * FROM sys.dm_fts_parser('"Peter Green"', 1033, 0, 0)
    
    通过它,您可以对查询的其余部分交叉应用

    有关更多信息,请参阅主题和章节K。在主题中使用Apply

    示例:(启用全文引擎的SQL Server Enterprise 2008)

    输出:

    具有最高置信度的匹配优先(所有其他匹配都使用带窗口的排名查询过滤掉)

    它并不完美,但这是一个很好的起点,可以对其进行调整,以提供更高的成功概率

    if not OBJECT_ID('Names1', 'Table') is null drop table names1
    if not OBJECT_ID('Names2', 'Table') is null drop table names2
    
    create table Names1 
    (
        id int identity(0, 1),
        name nvarchar(128)
    )
    insert into Names1 (name) values ('Green, Peter')
    insert into Names1 (name) values ('Smith, Peter')
    insert into Names1 (name) values ('Aadland, Beverly')
    insert into Names1 (name) values ('Aalda, Mariann')
    insert into Names1 (name) values ('Aaliyah')
    insert into Names1 (name) values ('Aames, Angela')
    insert into Names1 (name) values ('Aames, Willie')
    insert into Names1 (name) values ('Aaron, Caroline')
    insert into Names1 (name) values ('Aaron, Quinton')
    insert into Names1 (name) values ('Aaron, Victor')
    insert into Names1 (name) values ('Abbay, Peter')
    insert into Names1 (name) values ('Abbott, Dorothy')
    insert into Names1 (name) values ('Abbott, Bruce')
    insert into Names1 (name) values ('Abbott, Bud')
    insert into Names1 (name) values ('Abbott, Philip')
    insert into Names1 (name) values ('Abdoo, Rose')
    insert into Names1 (name) values ('Abdul, Paula')
    insert into Names1 (name) values ('Abel, Jake')
    insert into Names1 (name) values ('Abel, Walter')
    insert into Names1 (name) values ('Abeles, Edward')
    insert into Names1 (name) values ('Abell, Tim')
    insert into Names1 (name) values ('Aber, Chuck')
    
    create table Names2
    (
        id int identity(200, 1),
        name nvarchar(128)
    )
    insert into Names2 (name) values (LOWER('Peter.Green'))
    insert into Names2 (name) values (LOWER('Peter.Smith'))
    insert into names2 (name) values (LOWER('Beverly.Aadland'))
    insert into names2 (name) values (LOWER('Mariann.Aalda'))
    insert into names2 (name) values (LOWER('Aaliyah'))
    insert into names2 (name) values (LOWER('Angela.Aames'))
    insert into names2 (name) values (LOWER('Willie.Aames'))
    insert into names2 (name) values (LOWER('Caroline.Aaron'))
    insert into names2 (name) values (LOWER('Quinton.Aaron'))
    insert into names2 (name) values (LOWER('Victor.Aaron'))
    insert into names2 (name) values (LOWER('Peter.Abbay'))
    insert into names2 (name) values (LOWER('Dorothy.Abbott'))
    insert into names2 (name) values (LOWER('Bruce.Abbott'))
    insert into names2 (name) values (LOWER('Bud.Abbott'))
    insert into names2 (name) values (LOWER('Philip.Abbott'))
    insert into names2 (name) values (LOWER('Rose.Abdoo'))
    insert into names2 (name) values (LOWER('Paula.Abdul'))
    insert into names2 (name) values (LOWER('Jake.Abel'))
    insert into names2 (name) values (LOWER('Walter.Abel'))
    insert into names2 (name) values (LOWER('Edward.Abeles'))
    insert into names2 (name) values (LOWER('Tim.Abell'))
    insert into names2 (name) values (LOWER('Chuck.Aber'));
    
    with ftsNamesFirst (id, term) as
    (
        select id, terms.display_term
            from names1 cross apply sys.dm_fts_parser('"' + name + '"', 1033, 0, 0) terms
    ), ftsNamesSecond (id, term) as
    (
    select id, terms.display_term
            from names2 cross apply sys.dm_fts_parser('"' + name + '"', 1033, 0, 0) terms
    )
    select * from 
    (
        select 
        ROW_NUMBER() over (partition by nfirst.id order by sum(DIFFERENCE(ftsNamesFirst.term, ftsNamesSecond.term)) desc) ranking,
        sum(DIFFERENCE(ftsNamesFirst.term, ftsNamesSecond.term)) Confidence,
        nFirst.id Names1ID,
        nFirst.name Names1Name, 
        nSecond.id Names2ID,
        nSecond.name Names2Name
        from 
        ftsNamesFirst cross join ftsNamesSecond 
        left outer join names1 nFirst on nFirst.id = ftsNamesFirst.id
        left outer join names2 nSecond on nSecond.id = ftsNamesSecond.id 
        where DIFFERENCE(ftsNamesFirst.term, ftsNamesSecond.term) = 4
        group by 
            nFirst.id, nFirst.name, nSecond.id, nSecond.name
    ) MatchedNames 
    where ranking = 1
    
    Confidence Names1ID Names1Name Names2ID Names2Name
    8   0   Green, Peter    200 peter.green
    8   1   Smith, Peter    201 peter.smith
    8   2   Aadland, Beverly    202 beverly.aadland
    8   3   Aalda, Mariann  203 mariann.aalda
    4   4   Aaliyah 204 aaliyah
    8   5   Aames, Angela   205 angela.aames
    8   6   Aames, Willie   206 willie.aames