Сбой Oracle regexp_like на FLOAT из вида - PullRequest
0 голосов
/ 13 декабря 2018

Я пытаюсь использовать regexp_like для поиска и удаления слишком точных чисел с плавающей запятой.

select c from t order by c asc;

возвращает много результатов, подобных этому: 0.0000000012345678

Используя regexp_like, я могу получить результаты для двух десятичных знаков (0,25):

select * from t where REGEXP_LIKE(c,'^\d+\.\d{2}');

Однако, когда я пытаюсьничего больше, чем в двух местах, я не получаю результатов:

select * from t where REGEXP_LIKE(c,'^\d+\.\d{3}');
...
select * from t where REGEXP_LIKE(c,'^\d+\.\d{10}');

Единственная дополнительная информация - это то, что я выбираю для вида второго просмотра и столбца, который я ищу (c, выше) обозначается как FLOAT.

1 Ответ

0 голосов
/ 13 декабря 2018

Вы можете рассматривать их как числа.Вы можете усечь значение до фиксированного числа десятичных разрядов:

Функция 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}$');

и т. д .;но, кажется, проще рассматривать их как числа, а не как строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...