2013-08-04 70 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