2011-12-01 68 views
9

我有一個需要搜索特定表(SQL)中的數據的搜索頁的asp.net Web應用程序。今天它只有一個簡單的LIKE查詢,使用參數化的SQL:使用邏輯運算符進行SQL搜索

SqlParameter[] param = new SqlParameter[1]; 

param[0] = new SqlParameter("@searchText", SqlDbType.VarChar); 
param[0].Value = "%" + text + "%"; 

using (SqlDataReader dr = SqlHelper.ExecuteReader(this.ConnectionString, CommandType.StoredProcedure, "isp_Search", param)) 
{ 
     //Do something 
} 

現在我需要添加選項以使用邏輯運算符進行搜索。

所以在文本框中,用戶可以搜索喜歡的事情

Adam OR Adams 
James AND NOT Jame 
Douglas AND (Adam OR Adams) 

添加全文索引的表是不是因爲我不控制數據模型中的優先選擇。

我正在尋找解釋文本查詢的方法,並將其轉換爲具有適當數量的SqlParams的SQL語句。

searchexpression = "Douglas AND (Adam OR Adams)" 
MakeSearchQuery(searchexpression, out sqlquery, out SqlParam[] params) 

將返回somelike像

sqlquery = "SELECT someFields FROM table WHERE [email protected] AND ([email protected] OR [email protected])" 

而一個sqlParams像

sqlParam[0] = 'Douglas' 
sqlParam[1] = 'Adam' 
sqlParam[2] = 'Adams' 

現在必須有專人在此之前做出這樣的事情?我搜索過SO和Google,但沒有取得任何真正的成功。對於開源/免費代碼或者如何將搜索表達式轉換爲SQL的好主意,我們表示歡迎。

+0

你使用哪個SQL引擎,答案因數據庫而異。一些支持正則表達式,有些則不支持。 – Johan

+0

SQL Server 2008 R2 – Paaland

回答

2

通過和/或/()等解析查詢需要通過某種解析器來完成。對於這樣簡單的事情,shunting-yard algorithm應該做得很好(當我們在標籤上過濾SE時,我們是如何處理和/或不是等的,儘管支持子括號的子表達式只能在內部使用)。這會產生操作的一棵樹,即(這裏使用前綴表示,但更通常用於產生AST)

and("Douglas", or("adam", "adams")) 

,你那麼就需要使用生成TSQL。不是微不足道的,但也不是火箭科學。