2011-12-01 10 views
9

特定のテーブル(SQL)内のデータを検索する検索ページを必要とするasp.net Webアプリケーションがあります。今日はそれだけでparametized SQLをuseing、シンプルLIKEクエリを持っています論理演算子を使用した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) 

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

、今までにこのような何かをした誰かがなければならない

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

ようsqlParamsのようなsomelikeを返すでしょうか?私はSOとGoogleの両方を本当の成功なしで検索しました。また、オープンソース/フリーコードへのポインタや、検索式をSQLに変換する方法についての良いアイデアを歓迎します。

+0

どのSQLエンジンを使用していますか?答えはデータベースごとに異なります。いくつかは正規表現をサポートし、あるものはサポートしません。 – Johan

+0

SQL Server 2008 R2 – Paaland

答えて

2

および/または/()などを使用したクエリの解析は、何らかのパーサーを介して行う必要があります。このような単純なことのために、shunting-yard algorithmはうまくいくはずです(そして、の大括弧で囲まれた部分式のサポートは、内部でのみ利用可能ですが、タグをSEにフィルタリングするときに、/または/などを処理する方法です)。これは、あなたがTSQLを生成するために使用する必要が

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

すなわち操作のツリー、生成されます(ここでは接頭辞表現を使用していますが、より典型的には、ASTを生成するために使用されます)。自明ではないが、ロケット科学ではない。