Извлечь число из строки с помощью функции Oracle

Мне нужно создать функцию Oracle, которая принимает строку в качестве параметра. Строка содержит буквы и цифры. Мне нужно извлечь все числа из этой строки. Например, если у меня есть строка типа RO1234, мне нужно иметь возможность использовать функцию, скажем extract_number(RO1234)и результат будет 1234.

Чтобы быть еще более точным, это тот тип SQL-запроса, в котором эта функция будет использоваться.

SELECT DISTINCT 'column_name', extract_number(column_name) 
FROM 'table_name' 
WHERE extract_number(column_name) = 1234;

ВОПРОС: Как добавить функцию, подобную этой, в мою базу данных Oracle, чтобы можно было использовать ее, как в примере выше, с использованием любых клиентских приложений Oracle SqlDeveloper или Sql Tools?

6 ответов

Решение

Вы бы использовали REGEXP_REPLACE чтобы удалить все нецифровые символы из строки:

select regexp_replace(column_name, '[^0-9]', '')
from mytable;

или же

select regexp_replace(column_name, '[^[:digit:]]', '')
from mytable;

Конечно, вы можете написать функцию extract_number, Хотя создание функции, состоящей только из одного вызова функции, кажется немного излишним.

create function extract_number(in_number varchar2) return varchar2 is
begin
  return regexp_replace(in_number, '[^[:digit:]]', '');
end; 

Вы можете использовать регулярное выражение для извлечения числа из строки, давайте проверим это: предположим, что это смешанная строка 'stack12345overflow569'

select regexp_replace('stack12345overflow569','[[:alpha:]]|_') as numberes from dual;

также вы можете использовать этот

выберите regexp_replace('stack12345overflow569', '[^0-9]', '') в качестве чисел, regexp_replace('Stack12345OverFlow569', '[^az and ^AZ]', '') в качестве символов из двойного

Я думаю, что это полезно для вас...

Это работает для меня, мне нужны только первые числа в строке:

      TO_NUMBER(regexp_substr(h.HIST_OBSE, '\.*[[:digit:]]+\.*[[:digit:]]*'))

в поле была следующая строка: "(43 Paginas) REGLAS DE PARTICIPACION".

поле результата: 43

Если вы ищете 1-е число с десятичной дробью, так как строка имеет правильные десятичные знаки, вы можете попробовать regexp_substr функционировать так:

regexp_substr('stack12.345overflow', '\.*[[:digit:]]+\.*[[:digit:]]*')

Чтобы извлечь символы из строки

      SELECT REGEXP_REPLACE(column_name,'[^[:alpha:]]') alpha FROM DUAL 

Чтобы извлечь месяц и год из строки A0807, я сделал следующее в PL/SQL:

      DECLARE
    lv_promo_code VARCHAR2(10) := 'A0807X';
    lv_promo_num VARCHAR2(5);
    lv_promo_month NUMBER(4);
    lv_promo_year NUMBER(4);
    BEGIN
    lv_promo_num := REGEXP_SUBSTR(lv_promo_code, '(\d)(\d)(\d)(\d)');

lv_promo_month := EXTRACT(month from to_date(lv_promo_num, 'MMYY'));
DBMS_OUTPUT.PUT_LINE(lv_promo_month);
lv_promo_year := EXTRACT(year from to_date(lv_promo_num, 'MMYY'));
DBMS_OUTPUT.PUT_LINE(lv_promo_year);
END;
Другие вопросы по тегам