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