我需要创建一个以字符串作为参数的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数据库中,以便能够像上例中一样使用它?
答案 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