Не е необходимо да екранирате -
вътре в символни класове, когато го поставите на първа или последна позиция, защото по този начин не може да бъде разчетен неправилно като диапазон:
[\- ]
-> [- ]код>
[\d\- ]
-> [\d -]код>
Начинът, по който го имате, е горната граница 10
в края е безсмислено.
Добавете $
в края, за да забраните символите в края.
Или \D
за да забраните крайните цифри (но изисква нецифра).
Или ($|\D)
или да завърши низа там, или да има нецифрено следване.
Съберете заедно:
SELECT '+79637434199' ~ '^(8|\+7)[ -]?(\(?\d{3}\)?[ -]?)[\d -]{7,10}($|\D)'
В противен случай вашият израз е добре и работи за мен на PostgreSQL 9.1.4. Не трябва да има никаква разлика дали го използвате в WHERE
клауза или в SELECT
списък - освен ако не се натъквате на грешка с някоя стара версия (като @kgrittn, предложено в коментарите).
Ако предваря литерала на низа с E
, мога да провокирам съобщението за грешка, което получавате. Това не може обяснете проблема си, защото казахте, че изразът работи добре като SELECT
елемент.
Но, както е цитиран Шерлок Холмс, "когато сте изключили невъзможното, каквото и да остане, колкото и невероятно да е, трябва да е истината."
Може би сте провели един тест с standard_conforming_strings =включено
а другият с standard_conforming_strings =off
- това беше интерпретацията по подразбиране на низови литерали в по-стари версии преди 9.1. Може би с два различни клиента (които имат различни настройки за това).
Прочетете повече в главата Константи на низове с Escapes в стил C в ръководството.