SQL Server - сопоставление нескольких строк из двух столбцов и записей списка с общими строками - PullRequest
0 голосов
/ 27 апреля 2018

Например, у меня есть эти данные:

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+'%'

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Решение с использованием сплиттера на основе XML может быть следующим: Смотрите демо-версию

  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
0 голосов
/ 27 апреля 2018

Практически любая функция split / parse подойдет. Вот линейный подход

* ** 1003 тысяча два * Пример
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

Returns

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