Sql server 2008 查找两个字符串之间不同的第一个字符位置
在这种情况下,可以使用PHP中的按位异或来查找两个字符串的第一个不同Charindex。如何在SQL query中实现此解决方案,或者是否有更好的解决方案解决此问题?我不认为存在与您针对SQL Server引用的问题中所示的任何方法等效的方法 唯一的方法似乎是按照PHP的建议手动遍历字符串,但在SQL中,由于无法像处理数组一样处理字符类型,因此这一过程更加困难:Sql server 2008 查找两个字符串之间不同的第一个字符位置,sql-server-2008,tsql,xor,Sql Server 2008,Tsql,Xor,在这种情况下,可以使用PHP中的按位异或来查找两个字符串的第一个不同Charindex。如何在SQL query中实现此解决方案,或者是否有更好的解决方案解决此问题?我不认为存在与您针对SQL Server引用的问题中所示的任何方法等效的方法 唯一的方法似乎是按照PHP的建议手动遍历字符串,但在SQL中,由于无法像处理数组一样处理字符类型,因此这一过程更加困难: DECLARE @A NVARCHAR(50) DECLARE @B NVARCHAR(50) DECLARE @I INT DECL
DECLARE @A NVARCHAR(50)
DECLARE @B NVARCHAR(50)
DECLARE @I INT
DECLARE @Pos INT
SET @A = 'Hello World!'
SET @B = 'Hella World!'
SET @I = 0
SET @Pos = 0
-- Loop through each character
WHILE (@I < LEN(@A) AND @I < LEN(@B) AND @Pos = 0)
BEGIN
-- See if the characters at this position differ
IF (SUBSTRING(@A, @I, 1) != SUBSTRING(@B, @I, 1))
SET @Pos = @I
SET @I = @I + 1
END
IF (@Pos > 0)
PRINT 'Difference at position ' + CAST(@Pos AS VARCHAR) + ' A:' + SUBSTRING(@A, @Pos, 1) + ' B:' + SUBSTRING(@B, @Pos, 1)
ELSE
PRINT 'Strings are the same'
请注意,如果您经常使用它,为了简单起见,可以将其放入UDF中,此外,我没有包括对空值的检查。更新:以下是Sql XOR解决方案:
仅适用于长度字母小于8的字符串
DECLARE @A VARCHAR(50)
DECLARE @B VARCHAR(50)
DECLARE @Pos INT
set @A='ABrC12@4'
set @B='ABrC1234'
SET @Pos=( select
case
when len(@A)<>LEN(@B) then -1
when @A=@B then 0
ELSE 1+PATINDEX('%[1-9]%',
CONVERT(varchar(max),cast(cast(CAST(@A AS varbinary) as BIGINT) ^
cast(CAST(@B AS varbinary) as BIGINT)
as varbinary ),2))/2
end)
Print @Pos
您可以通过以下方式使用一个很好的结果:
create FUNCTION [dbo].[fnFirstPosDif]
(
@Word as Nvarchar(70),
@Word2 as Nvarchar(70)
)
RETURNS INT
AS
BEGIN
declare @Strings2 TABLE
(
FirstPosDif INT
)
declare @FirstPosDif as int
;with C as
(
select @Word as Word,@Word2 as Word2 ,0 as Iteration
union all
select cast(substring(@Word,Iteration+1,1)as Nvarchar(70)) as Word,cast(substring(@Word2,Iteration+1,1)as Nvarchar(70)) as Word2,Iteration + 1 from C
WHERE Iteration < len(@Word) and cast(substring(@Word,Iteration+1,1)as Nvarchar(70))=cast(substring(@Word2,Iteration+1,1)as Nvarchar(70))
)
insert into @Strings2(FirstPosDif) select MAX(Iteration) as FirstPosDif from C
set @FirstPosDif=(select top 1 FirstPosDif from @Strings2)
return @FirstPosDif
END
虽然T-SQL至少可以用我能想到的4种不同的方法来实现,但没有一种只使用SQL的有效方法。如果您需要在SQL Server中完成此操作,那么您最好编写一个SQLCLR函数。非常有用!我只是需要一个像这样的函数来完成一些客户端的工作,这个工作非常完美!
create FUNCTION [dbo].[fnFirstPosDif]
(
@Word as Nvarchar(70),
@Word2 as Nvarchar(70)
)
RETURNS INT
AS
BEGIN
declare @Strings2 TABLE
(
FirstPosDif INT
)
declare @FirstPosDif as int
;with C as
(
select @Word as Word,@Word2 as Word2 ,0 as Iteration
union all
select cast(substring(@Word,Iteration+1,1)as Nvarchar(70)) as Word,cast(substring(@Word2,Iteration+1,1)as Nvarchar(70)) as Word2,Iteration + 1 from C
WHERE Iteration < len(@Word) and cast(substring(@Word,Iteration+1,1)as Nvarchar(70))=cast(substring(@Word2,Iteration+1,1)as Nvarchar(70))
)
insert into @Strings2(FirstPosDif) select MAX(Iteration) as FirstPosDif from C
set @FirstPosDif=(select top 1 FirstPosDif from @Strings2)
return @FirstPosDif
END