找出SQL Server中两个字符串之间的字符差异数

时间:2014-05-12 10:53:03

标签: sql-server string

我正在寻找一些内置功能,它能够找出两个字符串有多少不同。

例如:

CharDiff('SO0035F', 'SO005F') = 1

CharDiff('12345', '34512') = 0

2 个答案:

答案 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