2011-12-01 9 views
9

Tengo una aplicación web asp.net que necesita una página de búsqueda que busque datos en una tabla específica (SQL). Hoy en día sólo tiene un simple consulta como, useing sql establecieron los parámetros:Búsqueda SQL con operadores lógicos

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 
} 

Ahora tengo que añadir la opción de utilizar operadores lógicos para la búsqueda.

Así, en el cuadro de texto que un usuario podría buscar cosas como

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

Adición de indexación de texto completo para la tabla no es una opción preferida ya que yo no controlo el modelo de datos.

Estoy buscando un método para interpretar las consultas de texto y convertirlo en una declaración SQL con el número apropiado de SqlParams.

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

volvería somelike como

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

Y un sqlParams como

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

Ahora tiene que haber alguien que ha hecho algo como esto antes? He buscado SO y Google sin ningún éxito real. Y sugerencias para código abierto/código libre o una buena idea sobre cómo convertir la expresión de búsqueda en SQL es bienvenido.

+0

Con qué motor SQL trabajas, la respuesta difiere según la base de datos. algunos admiten expresiones regulares, otros no. – Johan

+0

SQL Server 2008 R2 – Paaland

Respuesta

2

El análisis de la consulta a través de y/o /() etc. debe hacerse a través de algún tipo de analizador. Para algo tan simple, un shunting-yard algorithm debería funcionar bien (y es así como manejamos el y/o/etc al filtrar SE en las etiquetas, aunque el soporte completo para sub-expresiones entre corchetes solo está disponible internamente). Esto generará un árbol de las operaciones, es decir, (en este caso el uso de la representación prefijo, pero más típicamente se usa para producir un AST)

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

que luego se tiene que utilizar para generar TSQL. No es trivial, pero tampoco ciencia de cohetes.

Cuestiones relacionadas