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.