2013-08-04 36 views
1

我很困惑要使用什么?SQL Server在列中搜索文本

基本上我需要有一个搜索字符串,可以搜索单个列的多个短语的发生,每个输入短语由空格分隔。

因此,从用户的输入会是这样:

"Phrase1 Phrase2 ... PhraseX"  (number of phrases can 0 to unknown!, but say < 6) 

我需要用逻辑来搜索:

Where 'Phrase1%' **AND** 'Phrase2%' **AND** ... 'PhraseX%' 

...等...所以所有词组必须找到。

总是逻辑与

SO速度,以帐户所采取的表现,难道我用:

罗得的

Like 'Phrase1%' and like 'Phrase2%' and like ... 'PhraseX%' ? 

或使用

patindex('Phrase1%' , column) > 0 AND patindex('Phrase2%' , column) > 0 
AND ...  patindex('PhraseX%' , column) 

或使用

增加全文搜索索引,

使用:

Where Contatins(Column, 'Phrase1*') AND Contatins(Column, 'Phrase2*') AND ... Contatins(Column, 'PhraseX*') 

或者

????

几乎太多的选择,这就是为什么我要问,这将是这样做的最有效的方法...

你的智慧表示赞赏...

+0

你确定它不是一个'或'?因为这不会返回任何内容:'喜欢'短语1%'和'短语2%''。顺便说一句,这种没有'%'的'LIKE'在开始时会受益于索引 – jazzytomato

+0

当然,它必须记住所有的单词......我已经用FTS解决方案,用“短语*” AND ... etc'...运行良好..谢谢.. – David

回答

2

如果您正在寻找,那么正确的通配符搜索将是:

Like '%Phrase1%' and like '%Phrase2%' and like ... '%PhraseX%' 

没有理由在这里使用patindex(),因为like是充分的,很好的优化。很好的优化,但这种情况下不能有效。这将需要全表扫描。而且,如果文本字段真的非常大(我的意思是至少有成千上万个字符),那么性能就不会很好。

解决方案是全文搜索。您将短语这是:

where CONTAINS(column, 'Phrase1 AND phrase2 AND . . . '); 

这里唯一的问题是当“短语”(这似乎是的话)你正在寻找的是停用词。

总之,如果您有超过几千行或您正在搜索的文本字段超过几千个字符,请使用全文选项。这仅仅是为了指导。如果您通过100行参考表进行搜索,并在说明字段中查找最多100个字符,那么like方法应该没问题。

+0

谢谢,这似乎是有道理的,我现在开始实施该解决方案。我可以问一下,如果其中一个词是停用词,会发生什么?什么是停止词? – David

+0

@David。 。 。停用词被文本引擎忽略(它们通常是“the”和“another”等单词)。我相信查询字符串和文本中都会忽略停用词,因此将返回包含所有其他词的文档。 –

+0

谢谢我有我的头,我现在需要做什么... :-) – David

2

个人而言,我喜欢这个解决方案 -

DECLARE @temp TABLE (title NVARCHAR(50)) 
INSERT INTO @temp (title) 
VALUES ('Phrase1 33'), ('test Phrase2'), ('blank') 

SELECT t.* 
FROM @temp t 
WHERE EXISTS(
    SELECT 1 
    FROM (
     VALUES ('Phrase1'), ('Phrase2'), ('PhraseX') 
    ) c(t) 
    WHERE title LIKE '%' + t + '%' 
) 
+0

聪明......但如何工作的未知数量的短语,我将如何填充值列表。也许是从某个东西的嵌套选择...嗯'要考虑的东西... – David