原来的答案: SQL Fiddle
我看到@ T-克劳森在PTR Blog
编辑
这种技术修正,以解决意见问题。DK:
SQL Fiddle
MS SQL Server 2012的架构设置:
CREATE TABLE StringTable
(
Id INT IDentity,
String varchar(max)
)
INSERT INTO StringTable
VALUES ('xx xx Golden horses Malaysia'),
('xx xx xx xx xx')
查询1:
WITH StringsCTE
AS
(
SELECT ID,String As StringValue,
CASE CHARINDEX(' ', String)
WHEN 0 THEN String
ELSE LEFT(String, CHARINDEX(' ',String) -1)
END AS Word,
1 as Position,
CASE CHARINDEX(' ',String)
WHEN 0 THEN ''
ELSE RIGHT(String, LEN(String) - CHARINDEX(' ',String))
END AS RestOfLine
FROM StringTable
UNION ALL
SELECT Id,S.StringValue,
CASE CHARINDEX(' ',RestOfLine)
WHEN 0 THEN RestOfLine
ELSE LEFT(RestOfLine, CHARINDEX(' ',RestOfLine) -1)
END,
Position + 1,
CASE CHARINDEX(' ',RestOfLine)
WHEN 0 THEN ''
ELSE RIGHT(RestOfLine, LEN(RestOfLine) - CHARINDEX(' ',RestOfLine))
END
FROM StringsCTE S
WHERE s.RestOfLine != ''
),
WordsPerString
As
(
SELECT S.Id, COUNT(s.Word) As NumberOfWords
FROM StringsCTE S
GROUP BY S.Id
)
SELECT COUNT(*) As Matches, (SELECT MAX(NumberOfWords) FROM WordsPerString) as Total
FROM StringsCTE S1
INNER JOIN StringsCTE S2
ON S1.Word = S2.Word AND S1.Id <> S2.Id
WHERE S1.Id = 1 AND
NOT EXISTS -- Not already matched
(SELECT * FROM StringsCTE S3 WHERE S3.Word = S2.Word AND S3.Id <> S1.ID AND S3.Position < S2.Position)
Results:
| MATCHES | TOTAL |
|---------|-------|
| 2 | 5 |
SQL在字符串操作上并不是很强大,如果您允许在服务器上安装一个,您可能需要考虑CLR例程。 – Sparky 2014-09-10 10:06:45
@Sparky,是的,我可以安装它,任何想法或有用的链接来实施解决方案? – Alaa 2014-09-10 10:09:40
在这里有关于堆栈溢出的链接,它实际上很容易在C#中,这里是一个这样的链接http://stackoverflow.com/questions/10648141/get-different-and-common-items-in-two-arrays- with-linq – Sparky 2014-09-10 10:20:36