使用 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
我需要创建一个将字符串作为参数的 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