Вы должны объявить свою версию Postgres, а также версия, которая была используется, когда код был написан (если вы это знаете). Двойная обратная косая черта в \\d
предлагает старую версию с standard_conforming_strings = off
. The manual:
Начиная с PostgreSQL 9.1, по умолчанию on
(предыдущие выпуски по умолчанию выключена).
В современных версиях с standard_conforming_strings = on
, эта строка имеет мало смысла, как регулярное выражение:
'^\\d+$'
. Для обнаружения строк, состоящих из одной или нескольких цифр, используйте либо E'^\\d+$'
(с префиксом E
), либо '^\d+$'
. Реквизиты:
Целые литералы также позволяют дополнительный ведущий знак для отрицательных/положительных чисел. И ведущий/болтающийся пробел также разрешен (обрезается автоматически) в Postgres.
Итак, это полное регулярное выражение для integer
:
CASE WHEN d.value ~ '^\s*[-+]?\d+\s*$' THEN d.value::int ELSE 0 END
Регулярное выражение объясняет:
^
.. начало строки
\s
.. class shorthand для [[:space:]]
(белое пространство)
*
.. quantifier для 0 и более
[+-]
.. знак класс консистенция г +
и -
?
.. квантификатор для 0 или 1 раз
\d
.. класс сокращение для [[:digit:]]
(цифр)
+
.. квантификатор в течение 1 или более раза
\s*
.. такие же, как выше
$
.. конец строки
Теперь мы знаем основы. Подробнее читайте в руководстве, к которому я привязан. Рассмотрим правила синтаксиса для numeric string literals. И, в то время как государства о юридических числовых констант:
Там не может быть никаких пробелов или других символов, встроенные в постоянном
Это потому, что числовая константа не котируется, поэтому белое пространство не представляется возможным. Не применимо для литье строки. Белое пространство допускается: Ведущий, конечный и правый после символа экспонента.
Так что это все юридические Струны для броска к numeric
:
'^\s*[-+]?\d*\.?\d+(?:[eE]\s*[-+]?\d+)?\s*$'
Единственный новый элемент являются parentheses (()
) to denote the contained regular expression as atom. Поскольку нас не интересуют обратные ссылки, используйте «не захватывающие»: (?:
... )
и добавьте знак вопроса (?:[eE]\s*[-+]?\d+)?
: «экспоненциальная» часть может быть добавлена или нет, в целом.
Предполагая точку (.
) как десятичный разделитель. Вместо этого вы можете использовать запятую (,
) или [,\.]
. Но только точка является законной для актеров.
Тест:
SELECT '|' || txt || '|' As text_with_delim
, txt ~ '^\s*[-+]?\d*\.?\d+([eE]\s*[-+]?\d+)?\s*$' As test
, txt::numeric AS number
FROM unnest ('{1, 123, 000, " -1 ", +2, 1.2, .34, 5e6, " .5e -6 "}'::text[]) txt;
Результат:
text_with_delim | test | number
-----------------+------+-----------
|1| | t | 1
|123| | t | 123
|000| | t | 0
| -1 | | t | -1
|+2| | t | 2
|1.2| | t | 1.2
|.34| | t | 0.34
|5e6| | t | 5000000
| .5e -6 | | t | 0.0000005
Или вы могли бы использовать для to_number()
для преобразования строк произвольного заданного формата.
Отличный аватар! * (из игры "Bruce Lee") * –
MOAAGH! Благодаря! – pmirnd