【问题标题】:SQL Server - matching multiple strings of two columns and list records with shared stringsSQL Server - 匹配两列的多个字符串并使用共享字符串列出记录
【发布时间】:2018-04-26 23:16:25
【问题描述】:

例如我有这个数据:

ID  word1       word2
1   white dog   black dog
2   big tall    tall building
3   wood        green wood
4   big house   green wood
5   long way    street

我想用相似的字符串列出两列:

ID  word1       word2
1   white dog   black dog
2   big tall    tall building
3   wood        green wood

我试过了,但没有成功:

SELECT word1, word2 from  Table where word1 like '%'+word2+'%'

【问题讨论】:

    标签: sql-server sql-server-2008 sql-server-2012


    【解决方案1】:

    几乎任何拆分/解析函数都可以。这是一个内联方法

    示例

    Select Distinct A.* 
     From  YourTable A
     Cross Apply (
                    Select RetVal = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
                    From  (Select x = Cast('<x>' + replace((Select replace(Word1,' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml).query('.')) as A 
                    Cross Apply x.nodes('x') AS B(i)
                 ) B
     Where charindex(' '+RetVal+' ',' '+Word2+' ')>0
    

    退货

    ID  word1       word2
    1   white dog   black dog
    2   big tall    tall building
    3   wood        green wood
    

    【讨论】:

      【解决方案2】:

      使用基于 XML 的拆分器的解决方案如下所示: See live demo

        SELECT 
              id,word1,word2
          FROM
           (
           SELECT 
            *,
            xmlwords1=cast('<X>'+replace(word1,' ','</X><X>')+'</X>' as XML),
            xmlwords2=cast('<X>'+replace(word2,' ','</X><X>')+'</X>' as XML)
           FROM 
               Sample
           )S1
           CROSS APPLY
           ( 
               SELECT 
                   splitwordsfromWord1 = data1.D.value('.','varchar(100)'),
               splitwordsfromWord2 =data1.D.value('.','varchar(100)')
               FROM 
            S1.xmlwords1.nodes('X') AS data1(D)
               JOIN
            S1.xmlwords2.nodes('X') AS data2(D)
               ON
                  data1.D.value('.','varchar(100)')= data2.D.value('.','varchar(100)')
            ) O
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-27
        • 2014-12-30
        • 1970-01-01
        • 2016-02-13
        相关资源
        最近更新 更多