求一字符串截取函数。

时间:2023-01-11 14:05:48
目的:
  从字符串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。

#8


是用全文索引吧?!学习~~

#9


where 
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(大狐狸):

#13


原则上写个函数可以实现搜索,但存在一个问题,函数的返回最大能返回 varchar(8000) 或 nvarchar(4000)

所以搜索的结果长度是有限制的

另外,一个关键字可能会在源字符串中出现多次,那是任取一次,还是全取?

#14


to davorsuker39(大狐狸):
  类似于搜索引擎。

#15


to zjcxc(邹建):
  搜索结果的长度要求是120的nvarchar。
  如果一个关键字在源字符串中出现多次,取最前的一次。

#16


关键字前后保留多少个字符?

#17


关键字前后保留多少个字符是未知的。取决于关键字的多少。最后的结果要求是120个字符左右。
例如:
如果只有一个关键字,则保留前后60个字符。
   那么,结果的总字符数是(60+关键字长度+60)。
如果有两个关键字,则保留前后30个字符。
   那么,结果的总字符数是(30+关键字1长度+30) + (30+关键字2长度+30)。


#18


你这样不合理,如果我的关键字本身就>=120,那岂不是不取了?

如果指定了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... 

以上就是我需要的结果。
谢谢。

#21


看来真是有难度了。。。

#22


还是有问题,我查询两个关键字,其中一个是100个字节,第二个是10字节

按你的分法,应该是取关键字前后共60个字节,显然第一个关键字处理不了.

#23


为什么第一个关键字处理不了?
如果第一个是100个字符,返回前后各60个字符,总共是220个字符。
如果前面不足60个,则从第一个开始。如果后面不够60个,则返回至最后一个字符。

#24


你总共返回120个字符不是吗?

前后60+本身的100,一共220,截断后(限制120嘛),就剩下120,即前面的60+60个关键字的字符,这个结果算什么?

#25


截断是指如果关键词的长度大于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...

怎样才能用最好的方法考虑到以上三种情况?
这才是问题的关键。
谢谢大家。

#28


前面两种情况已经解决。关键是第三种情况怎么判断?

#29


自己解决了。
用到了邹建的字符串分割函数。谢谢。

#30


学习

#1


where 字符串 like '%'+replace(关键词,' ','%')+'%'

#2


to lsxaa(小李铅笔刀):
  谢谢。可是我需要的是截取部分字符串的函数。

#3


什么意思? 取关键字前后的XX个字符??

字符串是什么类型的?

#4


有难度

#5


那得构造表了,进行查询了

#6


那得构造表了,进行查询了

#7


to zjcxc(邹建):
  没错。是取关键词前后的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

#10


我是问你被查询的数据是什么类型,而不是关键字

#11


实际上他这个和一般的搜索引擎差不多了!

#12


to zjcxc(邹建):
  被查询的数据是ntext。
to davorsuker39(大狐狸):

#13


原则上写个函数可以实现搜索,但存在一个问题,函数的返回最大能返回 varchar(8000) 或 nvarchar(4000)

所以搜索的结果长度是有限制的

另外,一个关键字可能会在源字符串中出现多次,那是任取一次,还是全取?

#14


to davorsuker39(大狐狸):
  类似于搜索引擎。

#15


to zjcxc(邹建):
  搜索结果的长度要求是120的nvarchar。
  如果一个关键字在源字符串中出现多次,取最前的一次。

#16


关键字前后保留多少个字符?

#17


关键字前后保留多少个字符是未知的。取决于关键字的多少。最后的结果要求是120个字符左右。
例如:
如果只有一个关键字,则保留前后60个字符。
   那么,结果的总字符数是(60+关键字长度+60)。
如果有两个关键字,则保留前后30个字符。
   那么,结果的总字符数是(30+关键字1长度+30) + (30+关键字2长度+30)。


#18


你这样不合理,如果我的关键字本身就>=120,那岂不是不取了?

如果指定了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... 

以上就是我需要的结果。
谢谢。

#21


看来真是有难度了。。。

#22


还是有问题,我查询两个关键字,其中一个是100个字节,第二个是10字节

按你的分法,应该是取关键字前后共60个字节,显然第一个关键字处理不了.

#23


为什么第一个关键字处理不了?
如果第一个是100个字符,返回前后各60个字符,总共是220个字符。
如果前面不足60个,则从第一个开始。如果后面不够60个,则返回至最后一个字符。

#24


你总共返回120个字符不是吗?

前后60+本身的100,一共220,截断后(限制120嘛),就剩下120,即前面的60+60个关键字的字符,这个结果算什么?

#25


截断是指如果关键词的长度大于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...

怎样才能用最好的方法考虑到以上三种情况?
这才是问题的关键。
谢谢大家。

#28


前面两种情况已经解决。关键是第三种情况怎么判断?

#29


自己解决了。
用到了邹建的字符串分割函数。谢谢。

#30


学习