Wie @a_horse kommentierte, müssten Sie den regulären Ausdrucksoperator ~
verwenden um Klammerausdrücke zu verwenden.
Aber es gibt noch mehr. Ich schlage vor:
SELECT *
FROM tbl
WHERE value ~ '^00[^0]'
^
... Übereinstimmung am Anfang der Zeichenfolge (Ihr ursprünglicher Ausdruck könnte an beliebigen übereinstimmen Position).[^0]
... ein Klammerausdruck (Zeichenklasse), der auf beliebig passt Zeichen, das nicht 0
ist .
Oder besser , dennoch:
SELECT *
FROM tbl
WHERE value LIKE '00%' -- starting with '00'
AND value NOT LIKE '000%' -- third character is not '0'
Wieso den? LIKE
ist nicht so leistungsfähig, aber normalerweise schneller als reguläre Ausdrücke. Wahrscheinlich geht es wesentlich schneller, die Kandidatenmenge mit einem billigen LIKE
einzugrenzen Ausdruck.
Im Allgemeinen würden Sie NOT LIKE '__0'
verwenden , aber da wir bereits LIKE '00%'
festlegen im anderen Prädikat können wir das schmalere (günstigere) Muster NOT LIKE '000'
verwenden .
Postgres kann einen einfachen btree Index verwenden für die links verankerten Ausdrücke value LIKE '00%'
(wichtig für große Tabellen), während dies für einen komplexeren regulären Ausdruck möglicherweise nicht funktioniert. Die neueste Version von Postgres kann Indizes für einfache reguläre Ausdrücke verwenden, also möglicherweise Arbeit für dieses Beispiel. Einzelheiten:
- Unterschied zwischen LIKE und ~ in Postgres