Не е необходимо да екранирате - вътре в символни класове, когато го поставите на първа или последна позиция, защото по този начин не може да бъде разчетен неправилно като диапазон:
[\- ] -> [- ]код> [\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 в ръководството.