代码语言
.
CSharp
.
JS
Java
Asp.Net
C
MSSQL
PHP
Css
PLSQL
Python
Shell
EBS
ASP
Perl
ObjC
VB.Net
VBS
MYSQL
GO
Delphi
AS
DB2
Domino
Rails
ActionScript
Scala
代码分类
文件
系统
字符串
数据库
网络相关
图形/GUI
多媒体
算法
游戏
Jquery
Extjs
Android
HTML5
菜单
网页交互
WinForm
控件
企业应用
安全与加密
脚本/批处理
开放平台
其它
【
MSSQL
】
SQL LIKE语句多条件贪婪加权匹配(新增必要词指定)
作者:
杨元
/ 发布于
2016/1/8
/
949
大多数情况下,通过贪婪加权匹配,已经可以实现非常重要的词“必然”出现,但有时候需要做一个保证,让结果更加合理。
GO CREATE function Get_StrArrayLength ( @str varchar(1024), --要分割的字符串 @split varchar(10) --分隔符号 ) returns int as begin declare @location int declare @start int declare @length int set @str=ltrim(rtrim(@str)) set @location=charindex(@split,@str) set @length=1 while @location<>0 begin set @start=@location+1 set @location=charindex(@split,@str,@start) set @length=@length+1 end return @length end GO CREATE function Get_StrArrayStrOfIndex ( @str varchar(1024), --要分割的字符串 @split varchar(10), --分隔符号 @index int --取第几个元素 ) returns varchar(1024) as begin declare @location int declare @start int declare @next int declare @seed int set @str=ltrim(rtrim(@str)) set @start=1 set @next=1 set @seed=len(@split) set @location=charindex(@split,@str) while @location<>0 and @index>@next begin set @start=@location+@seed set @location=charindex(@split,@str,@start) set @next=@next+1 end if @location =0 select @location =len(@str)+1 --这儿存在两种情况:1、字符串不存在分隔符号 2、字符串中存在分隔符号,跳出while循环后,@location为0,那默认为字符串后边有一个分隔符号。 return substring(@str,@start,@location-@start) end GO CREATE PROCEDURE proc_Common_SuperLike --要查询的表的主键字段名称 @primaryKeyName varchar(999), --要查询的表名 @talbeName varchar(999), --要查询的表的字段名称,即内容所在的字段 @contentFieldName varchar(999), --查询记录的个数(TOP *),匹配的个数越多,排名越靠前 @selectNumber varchar(999), --匹配字符分隔标记 @splitString varchar(999), --匹配字符组合字符串 @words varchar(999) AS declare @sqlFirst varchar(999) declare @sqlCenter varchar(999) declare @sqlLast varchar(999) declare @next int declare @arrayLength int declare @newWords varchar(999) declare @newTable varchar(999) BEGIN set @newTable=@talbeName set @newWords=@words set @next=dbo.Get_StrArrayLength(@words,'[') --判断是否有必要词 if @next>1 begin set @newTable='' --构造必要表sql语句 while @next>1 begin set @newTable=@newTable+@contentFieldName+' like ''%'+dbo.Get_StrArrayStrOfIndex(dbo.Get_StrArrayStrOfIndex(@words,'[',@next),']',1)+'%'' AND ' set @next=@next-1 end set @newTable=left(@newTable,(len(@newTable)-4)) --构造临时表 set @newTable='SELECT * into ##tempTable FROM '+ @talbeName + ' WHERE ' + @newTable execute(@newTable) --指定临时表 set @newTable='##tempTable' --去掉关键词组中的必要词标记 set @newWords=REPLACE(REPLACE(@words,'[',''),']','') end set @sqlCenter='' set @next=1 set @arrayLength=dbo.Get_StrArrayLength(@newWords,@splitString) while @next<=@arrayLength begin --构造sql查询条件(中间部分) set @sqlCenter = @sqlCenter+'SELECT '+@primaryKeyName+','+CONVERT(varchar(999),@arrayLength-@next+1)+' AS wordPower FROM '+@newTable+' WHERE '+@contentFieldName+' like ''%'+dbo.Get_StrArrayStrOfIndex(@newWords,@splitString,@next)+'%'' UNION ALL ' set @next=@next+1 end --处理sql语句中间部分,去除最后无用语句 set @sqlCenter=left(@sqlCenter,(len(@sqlCenter)-10)) --构造sql语句开头部分 set @sqlFirst='SELECT TOP '+@selectNumber+' '+@primaryKeyName+',COUNT(*)+SUM(wordPower) AS finalPower FROM (' --构造sql语句结尾部分 set @sqlLast=') AS t_Temp GROUP BY '+@primaryKeyName+' ORDER BY finalPower DESC' --拼接出完整sql语句,并执行 Execute(@sqlFirst+@sqlCenter+@sqlLast) --判断临时表是否存在,存在则删除,一定要删除! if OBJECT_ID('tempDb..##tempTable') is not null begin drop table ##tempTable end END 调用方法基本不变(参数个数未变): execute proc_Common_SuperLike'id','t_test','content','20','|','[i]|o|c' 新特性说明: l 定义:把必须要出现的关键词用方括号[]括起来。例如[i]|o|c,则i在结果中必须出现。 l 说明:假如需要匹配a、b、c三个关键词,重要性:a>b>c,那么可以这样写:a|b|c,这样已经保证a、b、c的权重依次降低,贪婪加权的算法基本可以保证:尽可能多的去匹配、尽可能匹配包含a的记录。但是某些时候为了提高准确性,要求结果中必须出现a,那么可以这样写:[a]|b|c。同理,必须出现a、b可以这样写:[a]|[b]|c。 l 其他:此次更新加入了临时表技术,保证必要关键词指定效率。
试试其它关键字
同语言下
.
SQL查询 多列合并成一行用逗号隔开
.
查看存储过程修改时间,最近执行时间
.
设置手动批量删除数据库相关进程
.
获取某个表中特定字段的所有字符串形式
.
SQL 如何去除重复的字符串
.
怎么去掉一个字段中的重复数据
.
String 去除空格 回车 换行 水平制表符
.
SQL查询和替换含有回车,空格,TAB
.
SQL SERVER 查询每日新增用户数量、次留数量
.
判断两个字符串是否存在相同的内容
可能有用的
.
SQL查询 多列合并成一行用逗号隔开
.
查看存储过程修改时间,最近执行时间
.
设置手动批量删除数据库相关进程
.
获取某个表中特定字段的所有字符串形式
.
SQL 如何去除重复的字符串
.
怎么去掉一个字段中的重复数据
.
String 去除空格 回车 换行 水平制表符
.
SQL查询和替换含有回车,空格,TAB
.
SQL SERVER 查询每日新增用户数量、次留数量
.
判断两个字符串是否存在相同的内容
杨元
贡献的其它代码
(
3
)
.
SQL LIKE语句多条件贪婪加权匹配(新增必要词指定)
.
SQL LIKE语句多条件贪婪加权匹配算法(改进版)
.
SQL LIKE语句多条件贪婪匹配算法
Copyright © 2004 - 2024 dezai.cn. All Rights Reserved
站长博客
粤ICP备13059550号-3