我想实现一个从firebird中的varchar中提取字母的存储过程。
示例:
v_accountno' is of type varchar(50) and has the following values
accountno 1 - 000023208821
accountno 2 - 390026826850868140H
accountno 3 - 0700765001003267KAH
我想从v_accountno中提取字母并将其输出到o_letter
。
在我的示例中:o_letter
将为帐号2存储H
,为帐号3存储KAH
。
我尝试了以下存储过程,这显然不适用于accountno 3.(请帮助)。
CREATE OR ALTER PROCEDURE SP_EXTRACT_LETTER
returns (
o_letter varchar(50))
as
declare variable v_accountno varchar(50);
begin
v_accountno = '390026826850868140H';
if (not (:v_accountno similar to '[[:DIGIT:]]*')) then
begin
-- My SP won't work in for accountno 3 '0700765001003267KAH'
v_accountno = longsubstr(v_accountno, strlen(v_accountno), strlen(v_accountno));
o_letter = v_accountno;
end
suspend;
end
答案 0 :(得分:2)
一种解决方案是用空字符串替换每个数字,如:
o_letter = REPLACE(v_accountno, '0', '')
o_letter = REPLACE(o_letter, '1', '')
o_letter = REPLACE(o_letter, '2', '')
...
答案 1 :(得分:1)
从 Firebird 3 开始,您可以使用 substring
,使用其正则表达式工具(使用 similar
子句):
substring(v_accountno similar '[[:digit:]]*#"[[:alpha:]]*#"' escape '#')