WHERE, ILIKE și expresii POSIX (~) în PostgreSQL

Interogări și filtrare specifică Postgres PostgreSQL 8.0+ (standard în PostgreSQL 15–17)

Filtrează rândurile folosind șabloane insensibile la majuscule (ILIKE) și expresii regulare POSIX (~, ~*).

Sintaxă SQL
SELECT * FROM tabel WHERE coloana ILIKE 'sablon%' OR coloana ~* 'expresie_regulara';

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 ~: operatorul SIMILAR TO cere potrivirea pe întregul șir (ca LIKE) și folosește % în loc de .*, în timp ce ~ caută subșirul oriunde dacă nu pui ancorele ^ și $.
  • Presupunerea că LIKE este insensibil la majuscule (cum se întâmplă implicit în MySQL pe anumite intercalări); în PostgreSQL LIKE este întotdeauna case-sensitive.

Comenzi și funcții înrudite