2012-03-29 4 views
5

Sto usando per scrivere una query di selezione e il valore per la dichiarazione simile è dinamico.È possibile eseguire una ricerca senza distinzione tra maiuscole e minuscole nell'istruzione LIKE in 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#%' 

Ma restituisce risultati solo se Caso di ogni carattere nella stringa # form.searchbar # è abbinato.

Si prega di suggerire una soluzione per questo in modo che diventa senza distinzione tra maiuscole e minuscole.

+3

Cosa banca dati stai usando? – softarn

+1

Quale DBMS? Forzare il rivestimento di entrambi i lati del test è spesso ciò che viene fatto, indipendentemente dal sistema/lingua. –

+1

Guarda anche per l'iniezione SQL. –

risposta

17

Non so che cosa database in uso, ma se questo fosse per Oracle, allora si può solo imporre il caso di entrambe le cose. Questo però ha un costo per i tempi di esecuzione dato che lo fa per tutti i valori in quella colonna, ma vedresti solo il costo se hai molti dati e potresti aggirarli con un indice basato su funzioni. Quindi, qualcosa di simile, sempre per Oracle:

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

Ma vorrei suggerire di utilizzare un queryparam poiché sembra provenire da una casella utente immesso, in modo da:

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

+1 per cfqueryparam. –

+0

Se si utilizza la parte superiore di una colonna, il database non utilizzerà un indice se definito in quella colonna, il figlio in una tabella grande verrà eseguito molto lentamente. È possibile definire un indice con la funzione superiore e lasciare la query come nell'esempio e quindi il database utilizzerà l'indice. Rivedere sempre il piano di esecuzione per la decisione presa dal database di utilizzare o meno il proprio indice. – Juan

1

Si potrebbe abbassare a.request_id e form.searchbar

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

Fallisce se '% # form.searchbar #%' è qualcosa come Test o tEst –

+0

Sì, appena capito. Hai dimenticato di dire di rendere anche lower.searchbar;) – Soader03

2

Ci sono già molte domande sul caso -insensibile dove clausole in Oracle:

Ad esempio, here.

Inoltre, questa query sembra essere vulnerabile agli attacchi di SQL injection. Maggiori informazioni here.

+0

Questa domanda differisce un po 'anche in relazione a ColdFusion. Prima di tutto è gentile su StackOverflow –

+0

Capisco, abbastanza giusto. –

+0

+1 per il rischio di iniezione sql –

1

È possibile forzare tutto in maiuscolo, come suggerisce Snipe656. È inoltre possibile utilizzare la funzione regexp_instr per eseguire una ricerca senza distinzione tra maiuscole e minuscole. Ad esempio, per cercare il tavolo EMP per ogni riga in cui ENAME contiene la stringa 'in' in un case-insensitive moda

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 

Nel tuo caso, probabilmente sarebbe qualcosa di simile

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