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

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值