【问题标题】: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