Situatie
Limbajul T-SQL are o serie de caractere speciale ce pot fi folosite in diverse situatii.
Problema apare cand avem nevoie sa cautam, intr-o coloana de tip textvarchar dupa unul sau mai multe dintre aceste caractere. Sa luam ca exemplu caracterul special % care in T-SQL este partial similar cu LIKE.
Daca, spre exemplu, vrem sa cautam intr-o tabela, pe coloana NUME, toate numele care se termina cu -escu, vom scrie un query de genul:
select * from tabela where NUME like ‘%escu’
care va returna toate numele care se termina exact cu escu.
Pe de alta parte, daca, spre exemplu vrem sa cautam toate numele care contin stringul stan (ex: Stanescu, Constantin) o sa scriem un query de genul:
select * from tabela where upper(NUME) like ‘%stan%’
care va returna toate numele ce contin stan (si care nu va tine cont de caractere mici sau mari).
Dar ce se intampla daca avem o coloana ce contine caracterul special si avem nevoie sa cautam caracterul % ?
Solutie
In cazul in care avem nevoie sa cautam un caracter special, lucrurile sunt un pic diferite. Presupunand ca avem o tabela ce contine o coloana Text1 de tip text varchar si vrem sa cautam in ea caracterul %, daca am proceda similar cu ce am facut mai sus ar trebui sa scrie un query de tipul:
select * from tabela where Text1 like ‘%%%’
Dar un asemenea query nu ar face decat sa intoarca TOATE liniile din tabela!
Daca am incerca sa scriem ceva de genul:
select * from tabela where Text1 like ‘%’%’%’
am obtine o eroare:
The data types varchar and varchar are incompatible in the modulo operator (pt ca, scris asa, engine-ul de sql interpreteaza caracterul special % ca fiind operandul MODULO)
Totusi sunt cateva moduri in care putem sa cautam intr-o coloana dupa un caracter special, pe care le prezint mai jos:
- select * from tabela where col1 like ‘%#%%’ escape ‘#’
- select * from tabela where col1 like ‘%[%]%’
- select * from tabela where charindex(‘%’, col1) > 0
Toate cele 3 exemple de mai sus au rezultat identic, returnand doar liniile ce contin caracterul %.
In exemplul numarul 1, caracterul # poate sa fie inlocuit cu orice, cu conditia ca acel orice sa fie pus intre doua caractere de tip apostrof dupa cuvantul rezervat escape.
Acum cateva cuvinte despre diferenta dintre ele dpdv al performantei.
Pe tabele foarte mari, este bine sa evitati exemplul 3, pt ca el nu se va folosi in niciun fel de niciun index (in cazul in care acesta exista pe tabela respectiva).
In exemplul 1 si exemplul 2, in cazul in care exista un nonclustered index, atunci procesorul de query-uri foarte probabil o sa foloseasca acel nonclustered index si il va scana pe acela in loc de a scana tabela sau indexul clustered (in cazul in care acesta exista) castigand astfel timp pe tabelele foarte mari.
In principiu, query-urile din exemplele 1 si 2 ar trebui sa mearga identic ca si performanta, pe tabele f mari, dar, din experienta mea, exemplul 1 se comporta putin mai bine, asa ca recomandarea mea este ca, atunci cand aveti nevoie sa cautati dupa caractere speciale pe tabele foarte mari, sa folositi scrierea din exemplul 1.
Leave A Comment?