我正在使用MS SQL 2008,现在我正面临着挑战。
我的SP参数可以包含一个字符串中的一到三个单词(nvarchar),我必须为字符串中的每个单词返回匹配的LIKE %phrase%
个记录。
实施例。我的参数是:
"stack overflow"
必须返回的记录:
miSTACKon
noOVERFLOWon
STACKit
poOWERFLOW
STACK
OWERFLOW
我也考虑过FTS,但CONTAINS函数在(每个)短语的末尾只有一个通配符
phrase*
除了动态SQL之外,是否有解决此问题的方法?
答案 0 :(得分:6)
从通用示例开始,然后我将使用一些“union alls”
来模拟它 select distinct Record from dbo.Records
inner join dbo.Split('stack overflow', ' ') tokens
on records_table.Record like '%' + tokens.value + '%'
所以我在下面做的是我模拟了一些数据,这些数据是“记录,以及来自dbo.Split函数的模拟返回,基本上是一个varchars表,'stack'和'overflow'标记为''。
select distinct Name from (
select 'stack' as Name
union all
select 'nope' as Name
union all
select ' stackoverflow' as Name
) records_table
inner join (
select 'stack' as value
union all
select 'overflow' as value) tokens
on records_table.Name like '%' + tokens.value + '%'
结果:
stack
stackoverflow
dbo.Split功能没什么特别之处,有很多实现例子......
答案 1 :(得分:0)
你可以传递带有固定分隔符(即',','|'等)的'words',这些字符对于任何可能的'words'(你支持的)都不是必需的,然后解析具有表值函数的该参数,最后加入具有类似于LIKE '%' + word + '%'
的JOIN条件的单词集。