繁体   English   中英

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

[英]Extract number from string with Oracle function

我需要创建一个将字符串作为参数的 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 数据库中,以便能够像上面的示例一样使用它,使用任何 Oracle SQL Developer 或 SQLTools 客户端应用程序?

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

这将返回“12345569”。

你也可以使用这个:

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

它将为数字返回“12345569”,为字符返回“StackOverFlow”。

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

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

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

结果字段: 43

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

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

为了从字符串“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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM