2011-12-01 15 views
9

Ho un'applicazione web asp.net che necessita di una pagina di ricerca che cerca i dati in una tabella specifica (SQL). Oggi ha solo una semplice domanda come, useing sql parametized:Ricerca SQL con operatori logici

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 
} 

Ora ho bisogno di aggiungere la possibilità di utilizzare operatori logici per la ricerca.

Così nella casella di testo un utente potrebbe cercare cose come

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

Aggiunta di indicizzazione full-text per la tabella non è un'opzione preferita dal momento che non controllano il modello di dati.

Sto cercando un metodo per interpretare le query di testo e convertire in un'istruzione SQL con il numero appropriato di SqlParams.

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

Sarebbe tornato somelike come

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

E uno sqlParams come

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

Ora ci deve essere qualcuno che hanno fatto qualcosa di simile prima? Ho cercato sia su SO che su Google senza alcun vero successo. E i riferimenti a codice open source/libero o una buona idea su come convertire l'espressione di ricerca in SQL sono i benvenuti.

+0

Su quale motore SQL utilizzi, la risposta è diversa per database. alcuni supportano regexp, altri no. – Johan

+0

SQL Server 2008 R2 – Paaland

risposta

2

L'analisi della query tramite e/o /() ecc. Deve essere eseguita tramite una sorta di parser. Per qualcosa di così semplice, un dovrebbe fare bene (ed è il modo in cui gestiamo e/o/non ecc. Quando si filtra SE sui tag, sebbene il supporto completo per le sottoespressioni con bracketing sia disponibile solo internamente). Questo genererà un albero delle operazioni, vale a dire (qui utilizzando la rappresentazione prefisso, ma è più tipicamente utilizzato per la produzione di un AST)

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

che è quindi necessario utilizzare per generare TSQL. Non banale, ma nemmeno scienza missilistica.

Problemi correlati