Sql server 2008 查找两个字符串之间不同的第一个字符位置

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

在这种情况下,可以使用PHP中的按位异或来查找两个字符串的第一个不同Charindex。如何在SQL query中实现此解决方案,或者是否有更好的解决方案解决此问题?

我不认为存在与您针对SQL Server引用的问题中所示的任何方法等效的方法

唯一的方法似乎是按照PHP的建议手动遍历字符串,但在SQL中,由于无法像处理数组一样处理字符类型,因此这一过程更加困难:

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