sql >> Databáze >  >> RDS >> PostgreSQL

Problém s regulárním výrazem Postgres

Nemusíte escapovat - uvnitř tříd znaků, když je umístíte na první nebo poslední pozici, protože to nemůže být chybně interpretováno jako rozsah:

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

Jak to máte, horní mez 10 na konci je marné.
Přidat $ na konci zakázat koncové znaky.
Nebo \D zakázat koncové číslice (ale vyžadují jinou než číslici).
Nebo ($|\D) buď tam řetězec ukončí, nebo bude následovat nečíslice.

Dejte dohromady:

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

Jinak váš výraz je v pořádku a funguje mi na PostgreSQL 9.1.4. Na tom, zda jej použijete v WHERE, by neměl být žádný rozdíl klauzuli nebo v SELECT seznam – pokud nenarazíte na chybu s nějakou starou verzí (jako @kgrittn navržený v komentářích).

Pokud před řetězcový literál přidám E , mohu vyprovokovat chybovou zprávu, kterou dostanete. Toto nemůže vysvětlete svůj problém, protože jste uvedli, že výraz funguje dobře jako SELECT položka.

Ale, jak je citován Sherlock Holmes, "když jste vyloučili nemožné, cokoli zůstane, jakkoli nepravděpodobné, musí být pravda."

Možná jste provedli jeden test s standard_conforming_strings = on a druhý s standard_conforming_strings = off - toto byla výchozí interpretace řetězcových literálů ve starších verzích před 9.1. Možná se dvěma různými klienty (kteří mají jiné nastavení).

Přečtěte si více v kapitole Stringové konstanty s Escapes ve stylu C v návodu.




  1. SQL JOIN v PostgreSQL - Jiný plán provádění v klauzuli WHERE než v klauzuli ON

  2. Jak propojit tabulku s backendovou databází v Accessu 2016

  3. Pokus o přístup k offsetu pole na hodnotě typu bool

  4. Oracle - Aktualizace řádků s minimální hodnotou ve skupině sloupce z jiné tabulky