PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Проблем с регулярния израз на Postgres

Не е необходимо да екранирате - вътре в символни класове, когато го поставите на първа или последна позиция, защото по този начин не може да бъде разчетен неправилно като диапазон:

[\- ] -> [- ]
[\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 в ръководството.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Не мога да намеря клиентската библиотека на PostgreSQL (libpq)

  2. Извличане на всички привилегии на обект за конкретна роля

  3. Разлика между тип данни DECIMAL и NUMERIC в PSQL

  4. PostgreSQL репликация за аварийно възстановяване

  5. Postgresql varchar брои ли се с помощта на дължина на знака в unicode или дължина на символа в ASCII?