使用 Oracle 函数从字符串中提取数字

Extract number from string with Oracle function

我需要创建一个将字符串作为参数的 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 SQL Developer 或 SQL工具客户端应用程序?

您将使用 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 numbers from dual;

这将 return“12345569”。

你也可以用这个:

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

这将 return 数字为“12345569”,字符为 "Whosebug"。

如果您正在寻找带小数点的第一个数字,因为字符串具有正确的小数位,您可以尝试 regexp_substr 函数,如下所示:

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

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

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

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

结果字段:43

为了从字符串中提取月份和年份 '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;

从字符串中提取字符

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