2014-02-26 124 views
3

在這個Question可接受的解決方案使用bitwise XORPHP中找到兩個字符串的第一個不同的Charindex。如何在SQL查詢中實現此解決方案還是有更好的解決方案來解決這個問題?找到兩個字符串之間不同的第一個字符位置

+0

儘管它可以在T-SQL中完成(至少有4種我能想到的方式),但是沒有使用SQL的有效方法。如果你需要在SQL Server中完成它,那麼你最好的辦法是編寫一個SQLCLR函數。 – RBarryYoung

回答

0

我不相信存在與您引用的SQL Server問題中顯示的任何方法的等效方法。

的唯一途徑似乎是通過串手動行走(根據PHP的建議),但在SQL它更費力,由於這樣的事實,就好像它們是數組不能滿足CHAR類型:

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' 

運行此按照上面會產生以下的輸出:

Difference at position 5 A:o B:a 

注意,如果你經常使用它,你可以把它放到UDF爲簡單起見,另外我還沒有列入檢查NULL值。

1

更新:下面的SQL XOR解決方案:

只爲字符串LEN字母比8

DECLARE @A VARCHAR(50) 
DECLARE @B VARCHAR(50) 
DECLARE @Pos INT 

set @A='[email protected]' 
set @B='ABrC1234' 

SET @Pos=(select 
    case 
    when len(@A)<>LEN(@B) then -1 
    when @[email protected] 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 
相關問題