Это должно работать, если вам нужны только первые два десятичных знака. Обратите внимание: без выборочных данных ответ может быть выключен; если да, пожалуйста, приведите примеры некоторых из значений у вас возникли проблемы с:
SELECT CAST(REGEXP_SUBSTR(myVal, '(\d+\.\d{0,2})|(\d+)') AS NUMBER(20, 2))
FROM myTable
WHERE REGEXP_LIKE(myVal, '(\d+\.\d{0,2})|(\d+)')
Регулярное выражение должно работать без десятичного знака, а также с одним или двумя знаками после запятой. Обратите внимание, что все после второго десятичного разряда будет усечено, поэтому округление не произойдет. Если вы хотите округлить, измените \d{0,2}
на \d+
, а CAST
позаботится об округлении.
В статье WHERE
игнорируются столбцы, которые не содержат числа, что предотвращает ошибки литья.
Добавление: вот объяснение регулярных выражений. Он ищет один из двух шаблонов.
Первый образец: (\d+\.\d{0,2})
. Это ловит цифры с десятичными знаками.
(
==> разграничивает первый шаблон, определяющий начало первого рисунка
\d+
==> соответствует одному или более цифр (\d
означает "любую цифру")
\.
==> матч период (период является «специальный» символ так, чтобы соответствовать его буквально вам нужно избавиться от нее с косой черты (\
)
\d{0,2}
==> матч ноль, один или две цифры
)
==> ограничивает первый шаблон, определяющий конец первого рисунка
Второй образец: (\d+)
.Он ловит цифры без десятичных знаков.
(
==> определяет начало второго шаблона
\d+
==> соответствует одному или более цифр
)
==> определяет конец второго шаблона
Наконец , два шаблона соединяются с оператором OR
(|
), поэтому вы получите соответствие, если любой шаблон совпадает.
(
первая модель)|(
второго узора)
Порядок узоров важен здесь, потому что «число с десятичными знаками» также соответствует «числу без десятичных знаков» образец ; поэтому шаблон «число с десятичными знаками» является первым.
отредактируйте ваш вопрос, чтобы включить ваши лучшие догадки о том, что вы пробовали. Еще лучше, не можете ли вы установить это у источника. поиск строк занимает много времени, особенно если их у них много. Удачи. – shellter
Если вы получаете более 1 десятичной точки, разве это не означает, что вы неправильно ее извлекаете? – Noel