SQL:表中不同字符的数量

时间:2018-06-27 20:11:39

标签: sql sql-server

给出下表:

A     B    
abcde abcdf 
bcdef bcdef
cdefg fgecd

我想要以下内容:

A     B     Number_of_different_characters
abcde abcdf 1
bcdef bcdef 0
cdefg fgecd 4

其中第三列计算不同字符的数量。请注意,这些字符串的顺序必须相同。

谢谢!

已编辑

我基本上希望在A列和B列之间的字符串中(按顺序重要)不同字符的数量。因此,如果A = B,C列仅显示0。可以假定A和B中字符串的长度为等于。

3 个答案:

答案 0 :(得分:0)

“强力”答案,您需要与最大字符串长度一样多的总和 我想对此有更好的答案。 在FROM后面放一个联合而不是(RES)

    SELECT
        RES.*, 
        CASE WHEN SUBSTRING(RES.A, 1, 1)=SUBSTRING(RES.B, 1, 1) THEN 0 ELSE 1 END
        + CASE WHEN SUBSTRING(RES.A, 2, 1)=SUBSTRING(RES.B, 2, 1) THEN 0 ELSE 1 END
        + CASE WHEN SUBSTRING(RES.A, 3, 1)=SUBSTRING(RES.B, 3, 1) THEN 0 ELSE 1 END
        + CASE WHEN SUBSTRING(RES.A, 4, 1)=SUBSTRING(RES.B, 4, 1) THEN 0 ELSE 1 END
        + CASE WHEN SUBSTRING(RES.A, 5, 1)=SUBSTRING(RES.B, 5, 1) THEN 0 ELSE 1 END
        + CASE WHEN SUBSTRING(RES.A, 6, 1)=SUBSTRING(RES.B, 6, 1) THEN 0 ELSE 1 END
        + CASE WHEN SUBSTRING(RES.A, 7, 1)=SUBSTRING(RES.B, 7, 1) THEN 0 ELSE 1 END
        + CASE WHEN SUBSTRING(RES.A, 8, 1)=SUBSTRING(RES.B, 8, 1) THEN 0 ELSE 1 END
        + CASE WHEN SUBSTRING(RES.A, 9, 1)=SUBSTRING(RES.B, 9, 1) THEN 0 ELSE 1 END
        AS [Number_of_different_characters]
    FROM  
    (
        SELECT 'abcde' AS A, 'abcdf' AS B 
        UNION
        SELECT 'bcdef' AS A, 'bcdef' AS B 
        UNION
        SELECT 'cdefg' AS A, 'fgecd' AS B 
    ) AS RES

答案 1 :(得分:0)

您可以编写一个标量函数,并从A列和B列获取参数来确定字符串差异。

CREATE FUNCTION FN_DETECT_STR_DIFF(@STRINGA VARCHAR(10), @STRINGB VARCHAR(10))
RETURNS INT
AS
BEGIN
DECLARE @X INT,@LOOPCNT INT,@DIFFCNT INT = 0
SET @LOOPCNT = 1
SET @X = (SELECT TOP 1 LEN(A) FROM [table])
WHILE (@LOOPCNT <= @X)
BEGIN
DECLARE @COMPA VARCHAR(1), @COMPB VARCHAR(2)
SET @COMPA = (SUBSTRING(@STRINGA,@LOOPCNT,1))
SET @COMPB = (SUBSTRING(@STRINGB,@LOOPCNT,1))

IF @COMPA != @COMPB
BEGIN
SET @DIFFCNT = @DIFFCNT + 1
END
SET @LOOPCNT = @LOOPCNT + 1
END

RETURN @DIFFCNT
END

SELECT *,DBO.FN_DETECT_STR_DIFF(A,B) AS DIFFERENCE FROM [table]

enter image description here

答案 2 :(得分:0)

您可以使用递归CTE一步一步地遍历字符串的字符,然后比较它们是否相等。如果不是,则将1加到计数器中。标记比较最后一个字符的记录,然后使用该标记选择最终结果。

WITH cte(n, d, a, b, e)
AS
(
SELECT 0 n,
       0 d,
       a,
       b,
       0 e
       FROM elbat
       WHERE len(a) = len(b)
UNION ALL
SELECT n + 1 n,
       d + CASE 
             WHEN substring(a, n + 1, 1) <> substring(b, n + 1, 1)
               THEN 1
             ELSE
               0
           END d,
       a,
       b,
       CASE
         WHEN len(a) = n
           THEN 1
         ELSE
           0
       END e
       FROM cte
       WHERE n <= len(a)
)
SELECT a,
       b,
       d
       FROM cte
       WHERE e = 1;

SQL Fiddle