Reguläre Ausdrücke, die in PostgreSQL LIKE-Klausel
Ich bin stecken mit einem einfachen regulären Ausdruck. Nicht sicher, was ich bin fehlt. Ein wenig rostig auf regex-Fähigkeiten.
Den Ausdruck, den ich bin versucht, ist:
select * from table where value like '00[1-9]%'
-- (third character should not be 0)
Also diese sollten übereinstimmen '0090D0DF143A'
(format: text), aber es ist NICHT!
Die SQL
Das hat geholfen.Danke!
LIKE
Betreiber nicht unterstützt reguläre Ausdrücke. Sie benötigen similar to
oder die ~
operator: postgresql.org/docs/current/static/...Das hat geholfen.Danke!
InformationsquelleAutor borarak | 2014-06-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie @a_horse kommentiert, Sie müssten die regulärer Ausdruck operator
~
zu verwenden Klammer-Ausdrücke.Aber es gibt noch mehr. Ich schlage vor:
^
... Spiel am start der Zeichenkette (Ihrem ursprünglichen Ausdruck übereinstimmen könnte bei alle position).[^0]
... ein Klammer-Ausdruck (Charakter-Klasse) passende alle Zeichen, dass nicht0
.Oder besser, aber:
Warum?
LIKE
ist nicht so mächtig, aber in der Regel schneller als reguläre Ausdrücke. Es ist wohl wesentlich schneller zu verengen die Menge der Kandidaten mit einem günstigenLIKE
Ausdruck.Im Allgemeinen verwenden Sie
NOT LIKE '__0'
sein, aber da wir schon schaffenLIKE '00%'
im anderen Prädikat, das wir verwenden können, die schmaler (billiger) MusterNOT LIKE '000'
.Postgres können mit einem einfachen btree index für die linke verankert Ausdrücke
value LIKE '00%'
(wichtig für große Tabellen), während die, funktioniert möglicherweise nicht für einen komplexeren regulären Ausdruck. Die neueste version von Postgres-Indizes verwenden kann, für einfache reguläre Ausdrücke, so ist es könnte für dieses Beispiel funktioniert. Details:'^00[^0]'
oder'^00[^0].*'
statt'^00[^0]%'
in der ersten Abfrage? Sonst ist es nicht mit dem Beispiel0090D0DF143A
Danke, behoben
Es ist in der Tat die Verwendung von Indizes für diese regex, siehe: sqlfiddle.com/#!15/7019f/1
In diesem Fall wird die erste Abfrage in etwa so schnell wie die zweite. Ohne passenden index, der zweite wesentlich schneller. Getestet habe ich, aufbauend auf Ihrer fiddle: sqlfiddle.com/#!15/d9b43/5 Performance-tests auf sqlfiddle sind nicht immer zuverlässig. Ich lief des tests in einer lokalen 9.3 setup.
Wow, schon ein Unterschied! Ich werde dich daran erinnern 😉
InformationsquelleAutor Erwin Brandstetter
PostgreSQL
LIKE
Betreiber nicht unterstützt [charlist], jedochSIMILAR TO
tut.überprüfen HIER für eine umfassende Liste über DBs
LIKE
Betreiber.verwenden Sie Niemals
SIMILAR TO
.Warum Also @ErwinBrandstetter?
Ich im Zusammenhang mit meiner Begründung.
InformationsquelleAutor sunbabaphu