Использование regexp_replace для удаления букв из цифр
У меня есть куча данных с высотой - некоторые из них просто цифры, некоторые включают метры в конце или '. У меня также есть несколько диапазонов 1200-1300 и т. Д. (Я думаю, что вторая проблема должна быть решена по-другому). Я попытался поэкспериментировать с regexp_replace, но [^az], похоже, не работает. У кого-нибудь из вас есть хорошая идея, как избавиться от всего, что не является цифрой? Кроме того, если бы вы могли порекомендовать хороший сайт / книгу / курс о том, как очистить данные, я был бы очень признателен. Спасибо!
1 ответ
Давайте оставим диапазоны (например, 1200-1300) в стороне, поскольку - даже независимо от любого вида программирования - неясно, что вы хотели бы "извлечь" из этого. И вы также можете иметь проблемы с такими вещами, как '5 ft 10 in'
или аналогичные, если они возможны в ваших данных. (И неясно, что все это означает, если все высоты не используют одинаковую единицу измерения - некоторые в метрах, некоторые в футах, информация исчезает, когда вы просто сохраняете число).
Чтобы удалить все нецифровые символы из строки и сохранить их, вам НЕ нужны регулярные выражения, которые могут быть довольно медленными (на порядок медленнее!), Чем стандартные строковые функции.
Один из способов удаления всех нецифровых символов использует функцию TRANSLATE. Вот так:
translate(input_string, '0123456789' || input_string, '0123456789')
Функция "переводит" (заменяет) 0 на 0, 1 на 1 и т. Д., И любой символ во входной строке, который еще не появился ранее во втором аргументе (что в данном случае означает "не цифра"), в ничего (null, zip, исчезает, удаляется).
Пример (обратите внимание на использование TO_NUMBER для преобразования в фактические числа):
with
data (input_string) as (
select '1500' from dual union all
select '2100 m' from dual union all
select '535 ft' from dual
)
select input_string,
to_number(translate(input_string, '0123456789' || input_string,
'0123456789')) as extracted_number
from data;
INPUT_STRING EXTRACTED_NUMBER
------------ ----------------
1500 1500
2100 m 2100
535 ft 535