17

我需要创建一个以字符串为参数的 Oracle DB 函数。该字符串包含字母和数字。我需要从这个字符串中提取所有数字。例如,如果我有一个像RO1234这样的字符串,我需要能够使用一个函数,比如extract_number('RO1234'),结果将是1234

更准确地说,这是该函数将用于的那种 SQL 查询。

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

问题:如何使用任何 Oracle SQL Developer 或 SQLTools 客户端应用程序向我的 Oracle 数据库添加这样的功能,以便能够像上面的示例一样使用它?

4

5 回答 5

57

您将用于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; 
于 2015-09-30T08:27:31.400 回答
8

您可以使用正则表达式从字符串中提取数字。让我们检查一下。假设这是混合文本和数字“stack12345overflow569”的字符串。这个应该工作:

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

这将返回“12345569”。

你也可以使用这个:

select regexp_replace('stack12345overflow569', '[^0-9]', '') as numbers,
       regexp_replace('Stack12345OverFlow569', '[^a-z and ^A-Z]', '') as characters
from dual

这将返回数字的“12345569”和字符的“StackOverFlow”。

于 2016-10-24T13:27:18.513 回答
1

这对我有用,我只需要字符串中的第一个数字:

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

该字段具有以下字符串:"(43 Paginas) REGLAS DE PARTICIPACION".

结果字段:43

于 2021-02-16T22:51:13.117 回答
0

如果您正在寻找带小数的第一个数字,因为字符串具有正确的小数位,您可以尝试regexp_substr这样的功能:

regexp_substr('stack12.345overflow', '\.*[[:digit:]]+\.*[[:digit:]]*')
于 2018-12-28T23:40:34.270 回答
-1

为了从字符串“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;
于 2021-10-14T20:38:04.967 回答