给出下表:
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中字符串的长度为等于。
答案 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]
答案 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;