PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Postgres-Regex-Problem

Sie müssen - nicht maskieren innerhalb von Zeichenklassen, wenn Sie es an die erste oder letzte Position setzen, da es auf diese Weise nicht als Bereich missverstanden werden kann:

[\- ] -> [- ]
[\d\- ] -> [\d -]

So wie Sie es haben, ist die obere Grenze 10 am Ende ist zwecklos.
Fügen Sie $ hinzu am Ende, um abschließende Zeichen zu verbieten.
Oder \D nachgestellte Ziffern zu verbieten (erfordert aber keine Ziffer).
Oder ($|\D) um entweder die Zeichenfolge dort zu beenden oder eine Nicht-Ziffer folgen zu lassen.

Zusammengesetzt:

SELECT '+79637434199' ~ '^(8|\+7)[ -]?(\(?\d{3}\)?[ -]?)[\d -]{7,10}($|\D)'

Ansonsten ist Ihr Ausdruck in Ordnung und funktioniert bei mir unter PostgreSQL 9.1.4. Es sollte keinen Unterschied machen, ob Sie es in einem WHERE verwenden -Klausel oder in einem SELECT Liste - es sei denn, Sie stoßen auf einen Fehler mit einer alten Version (wie @kgrittn in den Kommentaren vorgeschlagen).

Wenn ich dem String-Literal E voranstelle , kann ich die Fehlermeldung provozieren, die Sie erhalten. Dies kann nicht Erklären Sie Ihr Problem, weil Sie angegeben haben, dass der Ausdruck als SELECT gut funktioniert Artikel.

Aber, wie Sherlock Holmes zitiert wird, „wenn man das Unmögliche ausgeschlossen hat, muss das, was übrig bleibt, wie unwahrscheinlich es auch sein mag, die Wahrheit sein.“

Vielleicht haben Sie einen Test mit standard_conforming_strings = on und die andere mit standard_conforming_strings = off - Dies war die Standardinterpretation von Zeichenfolgenliteralen in älteren Versionen vor 9.1. Vielleicht mit zwei verschiedenen Clients (die diesbezüglich unterschiedliche Einstellungen haben).

Lesen Sie mehr im Kapitel String-Konstanten mit Escapes im C-Stil im Handbuch.