PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Espressione regolare nella clausola LIKE di PostgreSQL

Come ha commentato @a_horse, dovresti usare l'operatore di espressione regolare ~ per usare le espressioni tra parentesi.
Ma c'è di più. Suggerisco:

SELECT *
FROM   tbl
WHERE  value ~ '^00[^0]'

^ ... corrisponde all'inizio della stringa (l'espressione originale potrebbe corrispondere a qualsiasi posizione).
[^0] ... un'espressione tra parentesi (classe di caratteri) corrispondente a qualsiasi carattere che non è 0 .

O meglio , ancora:

SELECT *
FROM   tbl
WHERE  value LIKE '00%'       -- starting with '00'
AND    value NOT LIKE '000%'  -- third character is not '0'

Come mai? LIKE non è così potente, ma in genere più veloce delle espressioni regolari. Probabilmente è sostanzialmente più veloce restringere l'insieme di candidati con un LIKE economico espressione.

In genere, useresti NOT LIKE '__0' , ma poiché abbiamo già stabilito LIKE '00%' nell'altro predicato, possiamo usare il modello più stretto (più economico) NOT LIKE '000' .

Postgres può usare un semplice indice btree per le espressioni ancorate a sinistra value LIKE '00%' (importante per grandi tabelle), mentre potrebbe non funzionare per un'espressione regolare più complessa. L'ultima versione di Postgres può utilizzare gli indici per semplici espressioni regolari, quindi potrebbe lavorare per questo esempio. Dettagli:

  • Differenza tra LIKE e ~ in Postgres