Ce face WHERE, ILIKE și expresii POSIX (~)
Clauza WHERE filtrează rândurile înainte de grupare și ordonare. Pe lângă operatorul SQL standard LIKE (sensibil la majuscule/minuscule în PostgreSQL), Postgres oferă operatorul ILIKE pentru potrivire de șabloane case-insensitive, precum și operatorii de expresii regulare POSIX: ~, ~*, !~ și !~*.
Pentru căutări rapide pe volume mari de text cu ILIKE '%termen%' sau expresii regulare, PostgreSQL permite indexarea coloanelor cu extensia pg_trgm și un index de tip GIN sau GiST.
Clauze, operatori și argumente
| Clauză / Operator | Descriere |
|---|---|
LIKE / NOT LIKE |
Potrivire de șablon sensibilă la capitalizare (% = orice secvență de caractere, _ = un singur caracter). |
ILIKE / NOT ILIKE |
Extensie PostgreSQL pentru potrivire de șablon insensibilă la majuscule și minuscule (echivalent cu ~~*). |
~ |
Verifică dacă șirul din stânga corespunde expresiei regulare POSIX din dreapta (sensibil la capitalizare). |
~* |
Verifică potrivirea cu o expresie regulară POSIX ignorând diferențele dintre majuscule și minuscule. |
!~ și !~* |
Negațiile operatorilor ~ și ~* (șirul nu corespunde expresiei regulare). |
SIMILAR TO |
Operator SQL hibrid între LIKE și expresii regulare (ancorat pe întregul șir); în practică se preferă ~. |
Exemple
Exemplul 1: Căutare insensibilă la majuscule cu ILIKE
Găsim toți utilizatorii al căror nume conține secvența „popescu” (indiferent dacă e scris „Popescu”, „POPESCU” sau „popescu”) și au contul activ.
SELECT id, nume_complet, email
FROM utilizatori
WHERE nume_complet ILIKE '%popescu%'
AND activ = true;
Rezultat interogare
id | nume_complet | email
----+---------------------+--------------------------
14 | Andrei Popescu | andrei.popescu@firma.ro
29 | Elena POPESCU-Marin | elena.pm@exemplu.ro
(2 rows)
Exemplul 2: Validarea formatului unui cod fiscal sau telefon cu operatorul POSIX ~
Selectăm facturile ale căror coduri de identificare încep cu prefixul opțional RO (insensibil la capitalizare prin ~*) urmat de 6 până la 10 cifre.
SELECT id, companie, cui
FROM furnizori
WHERE cui ~* '^RO[0-9]{6,10}$';
Rezultat interogare
id | companie | cui
----+----------------------+-------------
3 | Alfa Logistic SRL | RO14289512
8 | Digital Cloud SA | ro38910421
(2 rows)
Greșeli frecvente
- Confuzia între
SIMILAR TOși~: operatorulSIMILAR TOcere potrivirea pe întregul șir (caLIKE) și folosește%în loc de.*, în timp ce~caută subșirul oriunde dacă nu pui ancorele^și$. - Presupunerea că
LIKEeste insensibil la majuscule (cum se întâmplă implicit în MySQL pe anumite intercalări); în PostgreSQLLIKEeste întotdeauna case-sensitive.
Comenzi și funcții înrudite
SELECT și DISTINCT ON: Extrage rânduri din tabele și păstrează doar primul rând pentru fiecare grup de valori distincte.CREATE INDEX (B-Tree, GIN, Partial, CONCURRENTLY): Creează indecși B-Tree, GIN (pentru JSONB și Array), indecși parțiali (WHERE) și indecși pe expresii fără blocarea scrierilor.ARRAY, ANY() și unnest(): Stochează și manipulează tablouri tipizate (text[], int[]), verifică apartenența cu ANY() și le extinde în rânduri cu unnest().