Извлечь число из строки с помощью функции 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;