2
我需要對列進行搜索並按特定順序對結果進行排序。搜索條件和排序順序如下:SQL Server 2008 - 高級搜索/排序
至少'x'和給定搜索文本的至多所有字符必須匹配。結果應該按照開頭(然後按匹配的字符數進行排序),然後按包含(然後按照匹配和按字母順序排列的字符數)進行分組。
例如:
搜索文本:戰略聯盟的
值在數據庫:
搜索結果將出現在以下順序
有人可以幫我嗎?
我需要對列進行搜索並按特定順序對結果進行排序。搜索條件和排序順序如下:SQL Server 2008 - 高級搜索/排序
至少'x'和給定搜索文本的至多所有字符必須匹配。結果應該按照開頭(然後按匹配的字符數進行排序),然後按包含(然後按照匹配和按字母順序排列的字符數)進行分組。
例如:
搜索文本:戰略聯盟的
值在數據庫:
搜索結果將出現在以下順序
有人可以幫我嗎?
您正在尋找Levenshtein distance
這裏是T-SQL的算法實現:Calculating Levenshtein Distance in TSQL
由於函數簽名是這樣的:
CREATE FUNCTION [dbo].[LEVENSHTEIN](@s NVARCHAR(MAX), @t NVARCHAR(MAX))
/*
Levenshtein Distance Algorithm: TSQL Implementation
by Joseph Gama
http://www.merriampark.com/ldtsql.htm
您可以在查詢中調用它爲:
Select *
from ValuesInDatabase V
order by
[dbo].[LEVENSHTEIN]( V.ClientName, 'Alliance A')
你不應該期望高性能ormance。
編輯
我在這裏複製約瑟夫·伽馬的功能來保護它,不要忘了參觀devioblog:
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
謝謝danihp ..它爲我工作。 – user899055 2012-02-08 15:44:02
鏈接無效:( – 2013-06-02 20:14:02
@MohamedSakherSawan,所有鏈接爲mi。 – danihp 2015-09-04 16:27:15