У меня есть столбец типа text, который содержит случайные значения. Некоторые из них - это числа, некоторые другие тексты и некоторые другие смешанные тексты и цифры. Я пытаюсь различить их как:PostgreSQL, регулярное выражение для соответствия текстовым полям с числовыми значениями
myfield is_numeric
____________________
-4 true
0004 true
4.00 true
dog false
D04 false
04f false
В то время как другие - это имена и другие строки. Я использовал регулярное выражение
SELECT id,
myfield
(myfield::varchar~ '^-?[0-9]*.?[0-9]*$') is_numeric
FROM mytable
Чтобы сообщить, что строка содержит действительное число или нет. Однако я заметил, что такие значения, как D04
и 04c
, возвращают true
для этого регулярного выражения, которое для моего случая использования является ложным положительным.
Почему это происходит? Кажется, что ^
соответствует не обязательно целому значению, но любой допустимой подстроке значения. Однако значения, такие как D04f
, возвращают false
, поэтому даже если в поле есть числовая подстрока, то выполняет свою работу ^
и $
.
Я временно прибегли к использованию:
SELECT id,
myfield
(myfield::varchar ~ '^-?[0-9]*.?[0-9]*$'
AND myfield::varchar !~ '[^0-9\-\.]') is_numeric
FROM mytable
Но это, кажется, inneficient (и не исключает двойные точки), и я до сих пор удивляюсь, почему регулярное выражение правильно исключает строки, которые начинаются и конец с нечисловым символом, в то время как notrecely возвращает true для строки, которая содержит только конечный или ведущий нецифровой символ.
здесь: ''^-? [0-9] *.? [0-9] * $ '' эта часть '.?' Вы хотите быть любым символом или символом '.'? Если это второй, то нужно использовать scamed –