SQL Server 2008 多个 "LIKE" 语句的问题

3
我正在使用MS SQL 2008,最近几天一直面临一个挑战。 我的SP参数可以包含一个到三个单词的字符串(nvarchar),我必须为字符串中的每个单词返回匹配的LIKE %phrase%记录。
例如,我的参数是:
"stack overflow"

必须归还的记录:
miSTACKon
noOVERFLOWon
STACKit
poOWERFLOW
STACK
OWERFLOW

我也考虑了FTS,但CONTAINS函数只能在(每个)短语的末尾使用一个通配符。
phrase*

除了动态 SQL,还有其他解决这个问题的方法吗?

当您使用 CONTAINS(your_column, ' "stack" OR "overflow" ') 时会得到什么结果? - OMG Ponies
@OMG Ponies: 我只能获取精确匹配。使用CONTAINS时,我可以在每个短语的末尾使用'*'。 - Leon
在这里尝试应用全文搜索的问题在于,全文搜索的解析/索引是基于单词的,而你正在尝试匹配单词内的字符模式。 - Joe Stefanelli
2个回答

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函数的模拟返回值,基本上是一个varchar表,其中'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函数并没有什么特别之处,有很多实现示例可以参考...


我个人最喜欢的分割函数在这里 - Joe Stefanelli
这实际上解决了我问题的大部分。谢谢你。你有想法怎样按相关性排序结果吗?我想从完美匹配开始向下排序。我猜我的Split函数得以某种方式处理它... - Leon
你说的相关性是什么意思?你可以返回一个带有“split”值和排名的表格吗?然后按照排名排序。详细说明一下,我会考虑一下的。 - Nix
不是像FTS那样排名。我在考虑以参数单词的完全匹配为首,其后为具有一个字符差异(如果有)的部分匹配结果进行排序。目前我使用您的解决方案,首先使用“=”进行连接,在第二个相同的查询中使用“LIKE”,最后将两个结果集联合起来。这样可以使得确切匹配(如果存在)位于结果集开头,然后是通过LIKE选取的其他匹配项。这种方法能够完成任务(至少是重要部分),但是它似乎很混乱。 - Leon

0
您可以使用固定分隔符(例如“,”、“|”等)传递“单词”,该分隔符不会用于任何可能支持的“单词”,然后使用表值函数解析该参数,最后使用类似于LIKE '%' + word + '%'的JOIN条件连接单词集。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接