SQL语句实现按关健字模糊查询,并按匹配度排序

今天有人在CSDN上问,我就随手写了一段.

 

 CREATE TABLE tb (ID INT IDENTITY(1,1),VALUE VARCHAR(100))

INSERT tb SELECT '中国'

UNION ALL SELECT '中国人'

UNION ALL SELECT '中国人民'

UNION ALL SELECT '日本'

UNION ALL SELECT '日本人'

UNION ALL SELECT '我的心中有人姑娘'

UNION ALL SELECT '人民网'

UNION ALL SELECT '中国是个伟大的国家'

UNION ALL SELECT '我们都是中国人,都是炎黄子孙,都是龙人传人'

 

DECLARE @searchSTR VARCHAR(20)

SET @searchSTR='中国人'

SELECT ID,VALUE FROM tb a 

INNER JOIN fn_SplitStringToROWS(@searchSTR) b

    ON CHARINDEX(b.v,a.VALUE)>0

    WHERE VALUE LIKE '%[中国人]%' 

    GROUP BY ID,VALUE

    ORDER BY COUNT(DISTINCT v) DESC

 

DROP TABLE tb

 

--附函数

CREATE FUNCTION fn_SplitStringToROWS

(

@str VARCHAR(100)

)

RETURNS @t TABLE(v VARCHAR(2))

AS

BEGIN

    DECLARE @i INT

    SET @i=1

    WHILE @i<=LEN(@str)

        BEGIN

            INSERT @t SELECT SUBSTRING(@str,@i,1)

            SET @i=@i+1

        END

    RETURN

END

 

 

/*

 

 

(所影响的行数为 9 行)

 

ID          VALUE                                                                                                

----------- ---------------------------------------------------------------------------------------------------- 

9           我们都是中国人,都是炎黄子孙,都是龙人传人

2           中国人

3           中国人民

8           中国是个伟大的国家

1           中国

6           我的心中有人姑娘

7           人民网

5           日本人

 

(所影响的行数为 8 行)

 

*/

 

如果要实现匹配度排序,那么可以去掉 WHERE ... LIKE那句,多余

 

如果只想实现模糊的匹配,那么可以不需要连表,直接

 

SELECT ID,VALUE FROM tb  WHERE VALUE LIKE '%[中国人]%' 即可.

 

按词匹配.

 

create function f_splitIDX(@SourceSql varchar(8000),@StrSeprate varchar(10))

returns @temp table(id int identity(1,1),v varchar(100))

 

begin

    declare @i int

    set @SourceSql=rtrim(ltrim(@SourceSql))

    set @i=charindex(@StrSeprate,@SourceSql)

    while @i>=1

    begin

        insert @temp values(left(@SourceSql,@i-1))

        set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)

        set @i=charindex(@StrSeprate,@SourceSql)

    end

    if @SourceSql<>'\'

       insert @temp values(@SourceSql)

    return 

end

 

 

CREATE TABLE tb (ID INT IDENTITY(1,1),VALUE VARCHAR(100))

INSERT tb SELECT '中国'

UNION ALL SELECT '中国人,中国'

UNION ALL SELECT '中国,中国人'

UNION ALL SELECT '中国人民'

UNION ALL SELECT '中国'

UNION ALL SELECT '日本'

UNION ALL SELECT '日本人'

UNION ALL SELECT '我的心中有人姑娘'

UNION ALL SELECT '人民网'

UNION ALL SELECT '中国是个伟大的国家'

UNION ALL SELECT '我们都是中国人,都是炎黄子孙,都是龙人传人'

 

 

 

 

DECLARE @searchSTR VARCHAR(20)

SET @searchSTR='中国人 中国'

 

SELECT a.ID,VALUE FROM tb a

    INNER JOIN dbo.f_splitIDX(@searchSTR,' ') b

    ON CHARINDEX(v,VALUE)>0

    GROUP BY a.ID,Value

    ORDER BY COUNT(DISTINCT v) DESC,MIN(b.id),a.id

 

DROP TABLE tb

 

你可能感兴趣的:(SQL,DB)