2012-02-08 12 views
2

列の検索を実行し、結果を特定の順序で並べ替える必要があります。検索条件とソート順は次のようになります:SQL Server 2008 - 詳細検索/並べ替え

与えられた検索テキストの少なくとも 'x'と最大ですべての文字を一致させる必要があります。結果は、で始まり(その後、一致する文字数でソート)、続いてcontains(ソートされたアルファベット順の文字数でソート)の順にグループ化されます。例については

検索テキスト:アライアンスAデータベースで

値:

enter image description here

検索結果は次の順序で表示されます

enter image description here

誰かお手伝いできますか?

答えて

4

あなたはここにLevenshtein distance

T-SQLのためのアルゴリズムの実装を探しています:

CREATE FUNCTION [dbo].[LEVENSHTEIN](@s NVARCHAR(MAX), @t NVARCHAR(MAX)) 
/* 
Levenshtein Distance Algorithm: TSQL Implementation 
by Joseph Gama 

http://www.merriampark.com/ldtsql.htm 

はあなたのように、クエリでそれを呼び出すことができます:関数のシグネチャは次のようであるCalculating Levenshtein Distance in TSQL

として

Select * 
from ValuesInDatabase V 
order by 
    [dbo].[LEVENSHTEIN]( V.ClientName, 'Alliance A') 

高いパーフォーマンスを期待する必要はありませんormance。

編集

私はdevioblogを訪問することを忘れないでください、それを維持するために、ここでジョセフ・ガマの機能をコピー..それは私のために働いたおかげでdanihp

CREATE FUNCTION [dbo].[LEVENSHTEIN](@s NVARCHAR(MAX), @t NVARCHAR(MAX)) 
/* 
Levenshtein Distance Algorithm: TSQL Implementation 
by Joseph Gama 

http://www.merriampark.com/ldtsql.htm 

Returns the Levenshtein Distance between strings s1 and s2. 
Original developer: Michael Gilleland http://www.merriampark.com/ld.htm 
Translated to TSQL by Joseph Gama 

Fixed by Herbert Oppolzer/devio 
as described in http://devio.wordpress.com/2010/09/07/calculating-levenshtein-distance-in-tsql 
*/ 
RETURNS INT AS 
BEGIN 
    DECLARE @d NVARCHAR(MAX), @LD INT, @m INT, @n INT, @i INT, @j INT, 
    @s_i NCHAR(1), @t_j NCHAR(1),@cost INT 

    --Step 1 
    SET @n = LEN(@s) 
    SET @m = LEN(@t) 
    SET @d = REPLICATE(NCHAR(0),(@n+1)*(@m+1)) 
    IF @n = 0 
    BEGIN 
    SET @LD = @m 
    GOTO done 
    END 
    IF @m = 0 
    BEGIN 
    SET @LD = @n 
    GOTO done 
    END 

    --Step 2 
    SET @i = 0 
    WHILE @i <= @n BEGIN 
    SET @d = STUFF(@d,@i+1,1,NCHAR(@i))  --d(i, 0) = i 
    SET @i = @i+1 
    END 

    SET @i = 0 
    WHILE @i <= @m BEGIN 
    SET @d = STUFF(@d,@i*(@n+1)+1,1,NCHAR(@i)) --d(0, j) = j 
    SET @i = @i+1 
    END 

    --Step 3 
    SET @i = 1 
    WHILE @i <= @n BEGIN 
    SET @s_i = SUBSTRING(@s,@i,1) 

    --Step 4 
    SET @j = 1 
    WHILE @j <= @m BEGIN 
     SET @t_j = SUBSTRING(@t,@j,1) 
     --Step 5 
     IF @s_i = @t_j 
     SET @cost = 0 
     ELSE 
     SET @cost = 1 
     --Step 6 
     SET @d = STUFF(@d,@j*(@n+1)[email protected]+1,1, 
     NCHAR(dbo.MIN3(
      UNICODE(SUBSTRING(@d,@j*(@n+1)[email protected]+1,1))+1, 
      UNICODE(SUBSTRING(@d,(@j-1)*(@n+1)[email protected]+1,1))+1, 
      UNICODE(SUBSTRING(@d,(@j-1)*(@n+1)[email protected]+1,1))[email protected]) 
     )) 
     SET @j = @j+1 
    END 
    SET @i = @i+1 
    END  

    --Step 7 
    SET @LD = UNICODE(SUBSTRING(@d,@n*(@m+1)[email protected]+1,1)) 

done: 
    RETURN @LD 
END 
+0

。 – user899055

+0

リンクは有効ではありません:( –

+0

@MohamedSakherSawan、すべてのリンクはmiのために働いています。 – danihp

関連する問題