SQL Istruzione ESCAPE nella query LIKE


Esempio

Se implementi una ricerca di testo come LIKE -query, di solito lo fai in questo modo:

SELECT * 
FROM T_Whatever 
WHERE SomeField LIKE CONCAT('%', @in_SearchText, '%') 

Tuttavia, (a parte il fatto che non si dovrebbe utilizzare necessariamente LIKE quando è possibile utilizzare la ricerca fulltext), ciò crea un problema quando qualcuno inserisce un testo come "50%" o "a_b".

Quindi (invece di passare alla ricerca fulltext), puoi risolvere il problema usando l'istruzione LIKE -escape:

SELECT * 
FROM T_Whatever 
WHERE SomeField LIKE CONCAT('%', @in_SearchText, '%') ESCAPE '\'

Ciò significa che \ ora verrà trattato come carattere ESCAPE. Ciò significa, è ora possibile solo anteporre \ ad ogni carattere della stringa si cerca, ed i risultati inizieranno a essere corretti, anche quando l'utente inserisce un carattere speciale come % o _ .

per esempio

string stringToSearch = "abc_def 50%";
string newString = "";
foreach(char c in stringToSearch) 
     newString += @"\" + c;
 
sqlCmd.Parameters.Add("@in_SearchText", newString); 
// instead of sqlCmd.Parameters.Add("@in_SearchText", stringToSearch);

Nota: l'algoritmo di cui sopra è solo a scopo dimostrativo. Non funzionerà nei casi in cui 1 grafema è composto da più caratteri (utf-8). eg string stringToSearch = "Les Mise\u0301rables"; Dovrai farlo per ogni grafema, non per ogni personaggio. Non si dovrebbe usare l'algoritmo di cui sopra se si ha a che fare con lingue asiatiche / est-asiatiche / sud-asiatiche. O meglio, se vuoi che il codice corretto abbia inizio, dovresti farlo per ogni graphemeCluster.

Vedi anche ReverseString, una domanda-intervista in C #