SQL Server 2008 - 高级搜索/排序

标签 sql sql-server-2008 sorting full-text-search

我需要对列进行搜索并按特定顺序对结果进行排序。搜索条件和排序顺序如下:

给定搜索文本的至少“x”且至多所有字符必须匹配。结果应按开头(然后按匹配的字符数排序)和包含(然后按匹配的字符数和字母顺序排序)进行分组。

例如:

搜索文本:联盟 A

数据库中的值:

enter image description here

搜索结果应按以下顺序显示

enter image description here

有人可以帮我吗?

最佳答案

您正在寻找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' ) 

您不应该期望高性能。

已编辑

我在这里复制Joseph Gama的函数来保存它,别忘了访问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)+@i+1,1,
        NCHAR(dbo.MIN3(
          UNICODE(SUBSTRING(@d,@j*(@n+1)+@i-1+1,1))+1,
          UNICODE(SUBSTRING(@d,(@j-1)*(@n+1)+@i+1,1))+1,
          UNICODE(SUBSTRING(@d,(@j-1)*(@n+1)+@i-1+1,1))+@cost)
        ))
      SET @j = @j+1
    END
    SET @i = @i+1
  END      

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

done:
  RETURN @LD
END

关于SQL Server 2008 - 高级搜索/排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9194968/

相关文章:

sql - 使用 HAVING 子句计算 SQL 查询的结果

php url/rest bool 逻辑解析器

sql - 使用 LINQ-to-Entities 的 OrderBy 和 Distinct

php - 计算自然排序值以存储在数据库中以进行字符串排序

wordpress - Woocommerce,对基于短代码的产品列表进行排序下拉

mysql - 当我选择 MAX(updated_date) 时,其他列的值错误

sql - 在触发器中获取已删除行的 ODBC 通用方法

sql - 如何使用 Microsoft SQL Server Management Studio 为数据库中的所有触发器生成脚本

sql-server - 支持多个客户端的数据库设计

list - 根据权重分布从列表中随机选择 N 个项目的最快算法是什么?