我正在寻找一些内置功能,它能够找出两个字符串有多少不同。
例如:
CharDiff('SO0035F', 'SO005F') = 1
CharDiff('12345', '34512') = 0
答案 0 :(得分:3)
我需要稍微不同的东西。我需要比较' 1234'显示为不同于' 1243'的2个字符。即使它们包含相同的字符。
我想出了以下内容:
CREATE FUNCTION dbo.CharDiff (@string1 NVARCHAR(MAX), @string2 NVARCHAR(MAX))
RETURNS INT
AS
BEGIN
DECLARE @diffs INT = 0
WHILE LEN(@string1) > 0 AND LEN(@string2) > 0
BEGIN
IF SUBSTRING(@string1,1,1) <> SUBSTRING(@string2,1,1)
SELECT @diffs = @diffs + 1
SELECT @string1 = SUBSTRING(@string1,2,9999)
SELECT @string2 = SUBSTRING(@string2,2,9999)
END
RETURN @diffs + LEN(@string1) + LEN(@string2)
END
答案 1 :(得分:2)
由于this page列出了SQL Server中可用的所有字符串函数,因此我非常确定没有内置函数可用于此用例。
然而,在this post的帮助下,我想出了以下内容,似乎符合您的需求:
CREATE FUNCTION dbo.CharDiff (@string1 NVARCHAR(MAX), @string2 NVARCHAR(MAX))
RETURNS INT
AS
BEGIN
DECLARE @allDifferences INT = 0
DECLARE @charCount1 INT
DECLARE @charCount2 INT
--do this as long as both strings are longer than 0
WHILE LEN(@string1) > 0 AND LEN(@string2) > 0
BEGIN
--get char count for the character at index 1 in string 1
SELECT @charCount1 = (LEN(@string1) - LEN(REPLACE(@string1, SUBSTRING(@string1, 1, 1), '')))
--get char count for the character at index 1 in string 1 but for string2
SELECT @charCount2 = (LEN(@string2) - LEN(REPLACE(@string2, SUBSTRING(@string1, 1, 1), '')))
--strip all chars that now have been counted from string 2
SELECT @string2 = REPLACE(@string2, SUBSTRING(@string1, 1, 1),'')
--strip all chars that now have been counted from string 1
SELECT @string1 = REPLACE(@string1, SUBSTRING(@string1, 1, 1),'')
--add difference to counting variable
SELECT @allDifferences = @allDifferences + ABS(@charCount1 - @charCount2)
END
--is there any rest length on any of those string?
SELECT @allDifferences = @allDifferences + ABS(LEN(@string1) - LEN(@string2))
RETURN @allDifferences
END
基本上我只计算两个字符串中第一个字符串中索引1上当前存在的字符的出现次数。
然后我从两个字符串中删除所有已经计数的字符(这样,索引1每次迭代都会保存另一个字符),只要两个字符串中都包含任何字符。在该循环之后可能仍然存在的字符串的剩余长度可以简单地添加到@allDifferences
。