Вы можете рассматривать их как числа.Вы можете усечь значение до фиксированного числа десятичных разрядов:
Функция TRUNC
(число) возвращает n1 , усеченное до n2 десятичных знаков.
, а затем посмотрите, совпадает ли оно.Например, чтобы найти любые значения с более чем двумя значащими цифрами после десятичной точки:
select * from t where c != trunc(c, 2);
или найти значения с более чем 10 значащими цифрами:
select * from t where c != trunc(c, 10);
Я имеюиспользуется !=
вместо >
в случае, если у вас отрицательные значения.
Вы также можете использовать это как фильтр при удалении / обновлении или как часть set
обновления, если вы хотитеснизить точность - хотя в этом случае вы можете использовать round()
вместо fo trunc()
.
Когда вы используете regexp_like
, вы делаете неявное преобразование значения с плавающей запятой ви как документы для to_char()
примечание:
Если вы опустите fmt , то n преобразуется вVARCHAR2
значение точно достаточно длинное, чтобы содержать его значащие цифры.
, что означает, что 0.25 становится строкой '.25'
без начального нуля;который не соответствует даже вашему первому шаблону.
Вы можете разрешить отсутствие начального нуля, используя *
вместо +
, например, чтобы найти значения по крайней мере с 10 значащими цифрами после десятичной дробиточка:
select * from t where REGEXP_LIKE(c,'^\d*\.\d{10}');
или точно 10:
select * from t where REGEXP_LIKE(c,'^\d*\.\d{10}$');
и т. д .;но, кажется, проще рассматривать их как числа, а не как строки.