我们的数据可能类似于:
A-10001
A-10002
A-10003
B-10001
B-10002
B-10003
我们想要找到所有包含“A-100”的比赛。使用全文搜索,我们正在做类似的事情:
where contains(e.*, '"A-100*"')
但是,因为“ - ”被认为是一个破坏边界的词,并且因为A是一个干扰词(因为它是一个单个字符),所以查询不会返回任何结果。我想知道是否有任何(简单)方法可以返回预期的结果。
请注意,我理解在这个简化的场景中,我可以使用like而不是contains,类似于:
where
(e.myColumn1 like '%A-100%'
or e.myColumn2 like '%A-100%'
or e.myColumn3 like '%A-100%',
etc)
但是对于我的情况不会起作用(主要是出于性能原因而且因为我需要查看很多列)。
我也理解我可以将搜索字符串分成两个单词,并执行以下操作:
where
contains(e.*, '"100*"')
and (e.myColumn1 like '%A-100%'
or e.myColumn2 like '%A-100%'
or e.myColumn3 like '%A-100%',
etc)
但同样,由于有很多列,这不是一个理想的解决方案。
我对sql server 2005及更高版本的解决方案感兴趣,但是如果有一个特定于sql server 2008的解决方案,我也会对此感兴趣。
感谢您的帮助, 埃里克
答案 0 :(得分:1)
我认为你不会为此找到一个非常干净的解决方案。我可能会过度简化问题,但我的建议是前两个字符的派生(计算)列。如果您的优先级是读取性能,则将非聚集放在计算列上并包括完整列。这将使得能够寻找'A-'而对于总是需要扫描。即使您要评估多个列,对于每个列,这仍然应该比类似谓词的性能更好。