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

时间:2015-09-30 08:21:58

标签: sql oracle oracle11g oracle-sqldeveloper sqltools

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

4 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:4)

您可以使用正则表达式从字符串中提取数字。让我们检查一下。假设这是混合文本和数字'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”。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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

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

结果字段:43