2012-03-29 16 views
5

Estoy usando para escribir una consulta de selección y el valor para la declaración like es dinámico.¿Es posible realizar una búsqueda insensible a mayúsculas y minúsculas en una declaración LIKE en SQL?

AND  e.rank_request_id = a.request_id 
    AND  f.priority_request_id = a.request_id 
    AND  b.status_type_id = c.status_id 
    AND b.status_request_id = a.request_id 
    AND a.request_id LIKE '%#form.searchbar#%' 

Pero esto solo arroja resultados cuando coincide el caso de cada carácter en la cadena # form.searchbar #.

Por favor, sugiera una solución para esto para que no distinga entre mayúsculas y minúsculas.

+3

¿Qué base de datos ¿Estas usando? – softarn

+1

¿Qué DBMS? Forzar la carcasa de ambos lados de la prueba a menudo es lo que se hace, independientemente del sistema/idioma. –

+1

Mire también la inyección de SQL. –

Respuesta

17

No sé lo que la base de datos que está utilizando, pero si esto fuera para Oracle entonces se podría simplemente forzar el caso de las dos cosas. Sin embargo, esto tiene un costo para los tiempos de ejecución, ya que lo hace para todos los valores en esa columna, pero solo verías el costo si tienes una gran cantidad de datos y podrías trabajar con un índice basado en funciones. Así que algo como esto, de nuevo para Oracle:

AND UPPER(a.request_id) LIKE '%#UCase(Form.Searchbar)#%' 

Pero sugeriría que utilice un queryparam ya que parece provenir de una caja introducido por el usuario, por lo que:

AND UPPER(a.request_id) LIKE <cfqueryparam value="%#UCase(Form.Searchbar)#%" cfsqltype="cf_sql_varchar" /> 
+2

+1 para cfqueryparam. –

+0

Si usa la parte superior de una columna, la base de datos no usará un índice si está definido en esa columna, hijo en una tabla grande esto funcionará muy lento. Puede definir un índice con la función superior y dejar la consulta como el ejemplo y luego la base de datos usará el índice. Siempre revise el plan de ejecución para la decisión tomada por la base de datos para usar o no su índice. – Juan

1

Se podría bajar a.request_id y form.searchbar

AND lower(a.request_id) LIKE '%#form.searchbar#%' 
+0

Falla si '% # form.searchbar #%' es algo así como Test o tEst –

+0

Sí, acabo de descifrarlo. Olvidé decir para hacer que form.searchbar también sea más baja;) – Soader03

2

Ya hay muchas preguntas sobre el caso -insensible donde las cláusulas en Oracle:

Por ejemplo, here.

Además, esta consulta parece que puede ser vulnerable a los ataques de inyección SQL. Más información here.

+0

Esta pregunta difiere un poco ya que está relacionada con ColdFusion también. Primero es bueno en StackOverflow –

+0

Entiendo, es suficiente. –

+0

+1 por riesgo de inyección de sql –

1

Puede forzar todo a mayúsculas como sugiere Snipe656. También puede usar la función regexp_instr para realizar una búsqueda que no distinga entre mayúsculas y minúsculas. Por ejemplo, para buscar en la tabla EMP para cada fila en la ENAME contiene la cadena '' en forma de mayúsculas y minúsculas

SQL> ed 
Wrote file afiedt.buf 

    1 select ename, empno 
    2 from emp 
    3* where regexp_instr(ename, 'in', 1, 1, 1, 'i') > 0 
SQL>/

ENAME   EMPNO 
---------- ---------- 
MARTIN   7654 
KING    7839 

En su caso, probablemente sería algo así como

AND regexp_instr(a.request_id, '#form.searchbar#', 1, 1, 1, 'i') > 0 
Cuestiones relacionadas