从字符串t中截取包含关键词k的部分。其中,关键词k是由多个单词组成。类似于搜索引擎中搜索结果的摘要。
例如:
字符串t='北京百联美达美数码科技有限公司,是面向IT专业技术人员和软件开发及应用企业,以专业社区为中心的IT专业知识传播与服务商。公司以IT专业网站(www.CSDN.net)为中心,建立了庞大的专业用户群, 形成了网站和期刊杂志、专业出版、电子商务、企业服务、信息服务,教育培训等关联业务互动的商业模式。'
关键词k='IT 网站'
返回结果:'...是面向IT专业技术人员...形成了网站和期刊杂志...'
这个函数的关键是要求关键词中每一个单词都在结果中出现。例如上例中的'IT'和'网站'。
谢谢。
30 个解决方案
#1
where 字符串 like '%'+replace(关键词,' ','%')+'%'
#2
to lsxaa(小李铅笔刀):
谢谢。可是我需要的是截取部分字符串的函数。
谢谢。可是我需要的是截取部分字符串的函数。
#3
什么意思? 取关键字前后的XX个字符??
字符串是什么类型的?
字符串是什么类型的?
#4
有难度
#5
那得构造表了,进行查询了
#6
那得构造表了,进行查询了
#7
to zjcxc(邹建):
没错。是取关键词前后的N个字符。字符串是nvarchar类型的。
N是未知的。唯一的要求是截取后的字符串长度为120。
没错。是取关键词前后的N个字符。字符串是nvarchar类型的。
N是未知的。唯一的要求是截取后的字符串长度为120。
#8
是用全文索引吧?!学习~~
#9
where
charindex(t,substring(关键词k,1,charindex('',关键词k)-1))>0
or
charindex(t,substring(关键词k,charindex('',关键词k)+1),len(关键词k))>0
charindex(t,substring(关键词k,1,charindex('',关键词k)-1))>0
or
charindex(t,substring(关键词k,charindex('',关键词k)+1),len(关键词k))>0
#10
我是问你被查询的数据是什么类型,而不是关键字
#11
实际上他这个和一般的搜索引擎差不多了!
#12
to zjcxc(邹建):
被查询的数据是ntext。
to davorsuker39(大狐狸):
被查询的数据是ntext。
to davorsuker39(大狐狸):
#13
原则上写个函数可以实现搜索,但存在一个问题,函数的返回最大能返回 varchar(8000) 或 nvarchar(4000)
所以搜索的结果长度是有限制的
另外,一个关键字可能会在源字符串中出现多次,那是任取一次,还是全取?
所以搜索的结果长度是有限制的
另外,一个关键字可能会在源字符串中出现多次,那是任取一次,还是全取?
#14
to davorsuker39(大狐狸):
类似于搜索引擎。
类似于搜索引擎。
#15
to zjcxc(邹建):
搜索结果的长度要求是120的nvarchar。
如果一个关键字在源字符串中出现多次,取最前的一次。
搜索结果的长度要求是120的nvarchar。
如果一个关键字在源字符串中出现多次,取最前的一次。
#16
关键字前后保留多少个字符?
#17
关键字前后保留多少个字符是未知的。取决于关键字的多少。最后的结果要求是120个字符左右。
例如:
如果只有一个关键字,则保留前后60个字符。
那么,结果的总字符数是(60+关键字长度+60)。
如果有两个关键字,则保留前后30个字符。
那么,结果的总字符数是(30+关键字1长度+30) + (30+关键字2长度+30)。
例如:
如果只有一个关键字,则保留前后60个字符。
那么,结果的总字符数是(60+关键字长度+60)。
如果有两个关键字,则保留前后30个字符。
那么,结果的总字符数是(30+关键字1长度+30) + (30+关键字2长度+30)。
#18
你这样不合理,如果我的关键字本身就>=120,那岂不是不取了?
如果指定了2个关键字,只搜索到一个,岂不是只返回60个?
如果指定了2个关键字,只搜索到一个,岂不是只返回60个?
#19
总不可能搜索过一次,看看有多少搜索到的关键字,决定了取多少字节,再搜索一次取数吧?
#20
to zjcxc(邹建):
1.一般情况下,关键字不会大于120。如果确实是大于120的话,把120以后的省略掉。
2.如果指定了2个关键字,只搜索到一个,返回60个也可以。
这个函数的目的类似于搜索引擎。
如果在百度中搜索‘程序员 sqlserver’,你会得到以下结果:
·程序员超级开发宝典
...) [OOP_OOA_OOD]组件技术和中国的程序员(5592Bytes) [随想随写]C# VS
JAVA(8090Bytes) [.NET]... .NET综述(973Bytes) [SQLserver]Microsoft
SQL Server 7.0安全问题(2150Bytes) [SQLserver...
以上就是我需要的结果。
谢谢。
1.一般情况下,关键字不会大于120。如果确实是大于120的话,把120以后的省略掉。
2.如果指定了2个关键字,只搜索到一个,返回60个也可以。
这个函数的目的类似于搜索引擎。
如果在百度中搜索‘程序员 sqlserver’,你会得到以下结果:
·程序员超级开发宝典
...) [OOP_OOA_OOD]组件技术和中国的程序员(5592Bytes) [随想随写]C# VS
JAVA(8090Bytes) [.NET]... .NET综述(973Bytes) [SQLserver]Microsoft
SQL Server 7.0安全问题(2150Bytes) [SQLserver...
以上就是我需要的结果。
谢谢。
#21
看来真是有难度了。。。
#22
还是有问题,我查询两个关键字,其中一个是100个字节,第二个是10字节
按你的分法,应该是取关键字前后共60个字节,显然第一个关键字处理不了.
按你的分法,应该是取关键字前后共60个字节,显然第一个关键字处理不了.
#23
为什么第一个关键字处理不了?
如果第一个是100个字符,返回前后各60个字符,总共是220个字符。
如果前面不足60个,则从第一个开始。如果后面不够60个,则返回至最后一个字符。
如果第一个是100个字符,返回前后各60个字符,总共是220个字符。
如果前面不足60个,则从第一个开始。如果后面不够60个,则返回至最后一个字符。
#24
你总共返回120个字符不是吗?
前后60+本身的100,一共220,截断后(限制120嘛),就剩下120,即前面的60+60个关键字的字符,这个结果算什么?
前后60+本身的100,一共220,截断后(限制120嘛),就剩下120,即前面的60+60个关键字的字符,这个结果算什么?
#25
截断是指如果关键词的长度大于120,才截断。
返回的结果不会截断。
120是指正常情况下的结果。如果如你所说,关键词长度为100,这种情况会比较少见,返回结果超出120也没关系。
这些都不是这个问题的关键。
关键是怎样才能确保返回的结果中包含了每一个关键字?
返回的结果不会截断。
120是指正常情况下的结果。如果如你所说,关键词长度为100,这种情况会比较少见,返回结果超出120也没关系。
这些都不是这个问题的关键。
关键是怎样才能确保返回的结果中包含了每一个关键字?
#26
挺有趣的问题,学习学习
#27
如果只有一个关键词的话,这个问题简单,用以下函数就可以了。
substring(@t,charindex(@t,@k)-60,120+len(@t))
但是,如果有两个关键词的话,需要考虑以下几种情况:
例如:
@t='abcdefghijklmnopqrstuvwxyz'
为方便举例,现假设取每个关键词的前后各2个字符。
1.@k='d f',两个关键词在@t中出现的位置很近。
第一个关键词d的前后2个字符dcdef中就已经包含了第二个关键词f。
返回:...bcdef...
2.@k='d t',两个关键词的位置很远。
第一个关键词d的前后2个字符dcdef和第二个关键词t的前后2个字符qstuv互不重合。
返回: ...bcdef...qstuv...
3.@k='d g',两个关键词的位置不远不近。
第一个关键词d的前后2个字符dcdef和第二个关键词g的前后2个字符efghi部分重合。
返回:...bcdefghi...
怎样才能用最好的方法考虑到以上三种情况?
这才是问题的关键。
谢谢大家。
substring(@t,charindex(@t,@k)-60,120+len(@t))
但是,如果有两个关键词的话,需要考虑以下几种情况:
例如:
@t='abcdefghijklmnopqrstuvwxyz'
为方便举例,现假设取每个关键词的前后各2个字符。
1.@k='d f',两个关键词在@t中出现的位置很近。
第一个关键词d的前后2个字符dcdef中就已经包含了第二个关键词f。
返回:...bcdef...
2.@k='d t',两个关键词的位置很远。
第一个关键词d的前后2个字符dcdef和第二个关键词t的前后2个字符qstuv互不重合。
返回: ...bcdef...qstuv...
3.@k='d g',两个关键词的位置不远不近。
第一个关键词d的前后2个字符dcdef和第二个关键词g的前后2个字符efghi部分重合。
返回:...bcdefghi...
怎样才能用最好的方法考虑到以上三种情况?
这才是问题的关键。
谢谢大家。
#28
前面两种情况已经解决。关键是第三种情况怎么判断?
#29
自己解决了。
用到了邹建的字符串分割函数。谢谢。
用到了邹建的字符串分割函数。谢谢。
#30
学习
#1
where 字符串 like '%'+replace(关键词,' ','%')+'%'
#2
to lsxaa(小李铅笔刀):
谢谢。可是我需要的是截取部分字符串的函数。
谢谢。可是我需要的是截取部分字符串的函数。
#3
什么意思? 取关键字前后的XX个字符??
字符串是什么类型的?
字符串是什么类型的?
#4
有难度
#5
那得构造表了,进行查询了
#6
那得构造表了,进行查询了
#7
to zjcxc(邹建):
没错。是取关键词前后的N个字符。字符串是nvarchar类型的。
N是未知的。唯一的要求是截取后的字符串长度为120。
没错。是取关键词前后的N个字符。字符串是nvarchar类型的。
N是未知的。唯一的要求是截取后的字符串长度为120。
#8
是用全文索引吧?!学习~~
#9
where
charindex(t,substring(关键词k,1,charindex('',关键词k)-1))>0
or
charindex(t,substring(关键词k,charindex('',关键词k)+1),len(关键词k))>0
charindex(t,substring(关键词k,1,charindex('',关键词k)-1))>0
or
charindex(t,substring(关键词k,charindex('',关键词k)+1),len(关键词k))>0
#10
我是问你被查询的数据是什么类型,而不是关键字
#11
实际上他这个和一般的搜索引擎差不多了!
#12
to zjcxc(邹建):
被查询的数据是ntext。
to davorsuker39(大狐狸):
被查询的数据是ntext。
to davorsuker39(大狐狸):
#13
原则上写个函数可以实现搜索,但存在一个问题,函数的返回最大能返回 varchar(8000) 或 nvarchar(4000)
所以搜索的结果长度是有限制的
另外,一个关键字可能会在源字符串中出现多次,那是任取一次,还是全取?
所以搜索的结果长度是有限制的
另外,一个关键字可能会在源字符串中出现多次,那是任取一次,还是全取?
#14
to davorsuker39(大狐狸):
类似于搜索引擎。
类似于搜索引擎。
#15
to zjcxc(邹建):
搜索结果的长度要求是120的nvarchar。
如果一个关键字在源字符串中出现多次,取最前的一次。
搜索结果的长度要求是120的nvarchar。
如果一个关键字在源字符串中出现多次,取最前的一次。
#16
关键字前后保留多少个字符?
#17
关键字前后保留多少个字符是未知的。取决于关键字的多少。最后的结果要求是120个字符左右。
例如:
如果只有一个关键字,则保留前后60个字符。
那么,结果的总字符数是(60+关键字长度+60)。
如果有两个关键字,则保留前后30个字符。
那么,结果的总字符数是(30+关键字1长度+30) + (30+关键字2长度+30)。
例如:
如果只有一个关键字,则保留前后60个字符。
那么,结果的总字符数是(60+关键字长度+60)。
如果有两个关键字,则保留前后30个字符。
那么,结果的总字符数是(30+关键字1长度+30) + (30+关键字2长度+30)。
#18
你这样不合理,如果我的关键字本身就>=120,那岂不是不取了?
如果指定了2个关键字,只搜索到一个,岂不是只返回60个?
如果指定了2个关键字,只搜索到一个,岂不是只返回60个?
#19
总不可能搜索过一次,看看有多少搜索到的关键字,决定了取多少字节,再搜索一次取数吧?
#20
to zjcxc(邹建):
1.一般情况下,关键字不会大于120。如果确实是大于120的话,把120以后的省略掉。
2.如果指定了2个关键字,只搜索到一个,返回60个也可以。
这个函数的目的类似于搜索引擎。
如果在百度中搜索‘程序员 sqlserver’,你会得到以下结果:
·程序员超级开发宝典
...) [OOP_OOA_OOD]组件技术和中国的程序员(5592Bytes) [随想随写]C# VS
JAVA(8090Bytes) [.NET]... .NET综述(973Bytes) [SQLserver]Microsoft
SQL Server 7.0安全问题(2150Bytes) [SQLserver...
以上就是我需要的结果。
谢谢。
1.一般情况下,关键字不会大于120。如果确实是大于120的话,把120以后的省略掉。
2.如果指定了2个关键字,只搜索到一个,返回60个也可以。
这个函数的目的类似于搜索引擎。
如果在百度中搜索‘程序员 sqlserver’,你会得到以下结果:
·程序员超级开发宝典
...) [OOP_OOA_OOD]组件技术和中国的程序员(5592Bytes) [随想随写]C# VS
JAVA(8090Bytes) [.NET]... .NET综述(973Bytes) [SQLserver]Microsoft
SQL Server 7.0安全问题(2150Bytes) [SQLserver...
以上就是我需要的结果。
谢谢。
#21
看来真是有难度了。。。
#22
还是有问题,我查询两个关键字,其中一个是100个字节,第二个是10字节
按你的分法,应该是取关键字前后共60个字节,显然第一个关键字处理不了.
按你的分法,应该是取关键字前后共60个字节,显然第一个关键字处理不了.
#23
为什么第一个关键字处理不了?
如果第一个是100个字符,返回前后各60个字符,总共是220个字符。
如果前面不足60个,则从第一个开始。如果后面不够60个,则返回至最后一个字符。
如果第一个是100个字符,返回前后各60个字符,总共是220个字符。
如果前面不足60个,则从第一个开始。如果后面不够60个,则返回至最后一个字符。
#24
你总共返回120个字符不是吗?
前后60+本身的100,一共220,截断后(限制120嘛),就剩下120,即前面的60+60个关键字的字符,这个结果算什么?
前后60+本身的100,一共220,截断后(限制120嘛),就剩下120,即前面的60+60个关键字的字符,这个结果算什么?
#25
截断是指如果关键词的长度大于120,才截断。
返回的结果不会截断。
120是指正常情况下的结果。如果如你所说,关键词长度为100,这种情况会比较少见,返回结果超出120也没关系。
这些都不是这个问题的关键。
关键是怎样才能确保返回的结果中包含了每一个关键字?
返回的结果不会截断。
120是指正常情况下的结果。如果如你所说,关键词长度为100,这种情况会比较少见,返回结果超出120也没关系。
这些都不是这个问题的关键。
关键是怎样才能确保返回的结果中包含了每一个关键字?
#26
挺有趣的问题,学习学习
#27
如果只有一个关键词的话,这个问题简单,用以下函数就可以了。
substring(@t,charindex(@t,@k)-60,120+len(@t))
但是,如果有两个关键词的话,需要考虑以下几种情况:
例如:
@t='abcdefghijklmnopqrstuvwxyz'
为方便举例,现假设取每个关键词的前后各2个字符。
1.@k='d f',两个关键词在@t中出现的位置很近。
第一个关键词d的前后2个字符dcdef中就已经包含了第二个关键词f。
返回:...bcdef...
2.@k='d t',两个关键词的位置很远。
第一个关键词d的前后2个字符dcdef和第二个关键词t的前后2个字符qstuv互不重合。
返回: ...bcdef...qstuv...
3.@k='d g',两个关键词的位置不远不近。
第一个关键词d的前后2个字符dcdef和第二个关键词g的前后2个字符efghi部分重合。
返回:...bcdefghi...
怎样才能用最好的方法考虑到以上三种情况?
这才是问题的关键。
谢谢大家。
substring(@t,charindex(@t,@k)-60,120+len(@t))
但是,如果有两个关键词的话,需要考虑以下几种情况:
例如:
@t='abcdefghijklmnopqrstuvwxyz'
为方便举例,现假设取每个关键词的前后各2个字符。
1.@k='d f',两个关键词在@t中出现的位置很近。
第一个关键词d的前后2个字符dcdef中就已经包含了第二个关键词f。
返回:...bcdef...
2.@k='d t',两个关键词的位置很远。
第一个关键词d的前后2个字符dcdef和第二个关键词t的前后2个字符qstuv互不重合。
返回: ...bcdef...qstuv...
3.@k='d g',两个关键词的位置不远不近。
第一个关键词d的前后2个字符dcdef和第二个关键词g的前后2个字符efghi部分重合。
返回:...bcdefghi...
怎样才能用最好的方法考虑到以上三种情况?
这才是问题的关键。
谢谢大家。
#28
前面两种情况已经解决。关键是第三种情况怎么判断?
#29
自己解决了。
用到了邹建的字符串分割函数。谢谢。
用到了邹建的字符串分割函数。谢谢。
#30
学习