2013-05-17 35 views
0

我正在研究搜索僅在字符串內的兩個逗號之間出現的單詞的要求。SQL在逗號之間搜索

所以舉例來說,在我的數據庫,我有以下數據:

------------------------------------------------------------------------ 
| ID | TITLES 
------------------------------------------------------------------------ 
| 1 | THE QUICK BROWN FOX , JUMPS OVER , THE LAZY DOG 
------------------------------------------------------------------------ 
| 2 | THE, QUICK FOX JUMPS NIGHTLY , ABOVE WIZARD 
------------------------------------------------------------------------ 

所以,當人們搜索快速FOX他們應該得到的兩行。

但是當他們搜索 快速狐狸跳過,它應該只返回行2,因爲那些話只出現在逗號的同款。它不應該返回第一行。單詞QUICK,FOX和JUMPS都在第一行,但它們不屬於同一部分(用逗號分隔)。

是否有可能爲此創建一個SQL查詢?當然,我正在分解每個逗號,並在C#代碼中單獨進行搜索(雖然不是很優雅)。

我希望這是有道理的。任何幫助將不勝感激。

+1

爲什麼這個模式是非規範化的? –

+0

@andrey - 是的,我知道..它來自遺留的應用程序。 – skub

回答

2

如果你願意做這在C#(這聽起來像一個選項),我認爲你可以做到這一點相當漂亮。假設myRowsIEnumerable<Row>代表,代表一行,並且mySearchTermsIEnumerable<string>,它包含所有搜索項。

myRows.Where(row => row.Title.Split(",") 
        .Any(part => mySearchTerms 
         .All(searchTerm => part.Contains(searchTerm))); 

換句話說,我們正在尋找兩個逗號之間的字符串包含所有搜索項的行。

0

如果您不關心保留搜索詞組合,您可以使用LIKE來獲取完整的搜索詞。

select ID, Titles 
from theTable 
where Titles like '%Quick Fox Jumps%' 
+2

** QUICK FOX **應該得到兩行? – Damith

+0

@Damith,是的,那是真的。如果你擺脫「跳躍」,那麼它會返回兩行。 – gunr2171

+0

你確定!在第一個記錄'快速布朗福克斯'將不匹配'喜歡'%快速福克斯%',我不是下來的選民無論如何 – Damith

0

如果處理速度很重要,正確的解決方案是使用全文搜索:
標準SQL Server之一,或外部索引器(Lucene等)。

使用外部索引器時,您可以控制向其提供的內容,因此您可以去除不在兩個逗號之間的內容。

如果處理速度不重要,C#似乎是最好的解決方案。

0

這將返回您想要的結果「Quick Fox Jumps」

select ID, Titles 
from Test 
where Titles like '%Quick Fox Jumps%' 

現在,如果你希望爲「快速狐」結果,那就試試這個:

select ID, Titles 
from Test 
where Titles like '%Quick Fox%' 

%代表任意字符(前/後按位置)。

_僅代表每個展示位置之前/之後的一個字符。

所以儘可能多的_你說很多人物被採取。

有關詳細信息讀取here

編輯

如果你想..

行返回快速跳轉,即使他們不在一起然後搜索爲:

%快速%跳轉%

+1

這是問題,這是我發佈我的答案後意識到的:第一行是「Quick ** Brown ** Fox」,而不是「Quick Fox」,因此您的條件都不會觸發它。我們不理解他如何在SQL中進行搜索(或者想做)。 – gunr2171