如何使用 Firebird SQL 从字符串中提取字母
How to extract letters from a string using Firebird SQL
我想实现一个从 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
将为 accountno 2 存储 H
,为 accountno 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
一个解决方案是用空字符串替换每个数字,例如:
o_letter = REPLACE(v_accountno, '0', '')
o_letter = REPLACE(o_letter, '1', '')
o_letter = REPLACE(o_letter, '2', '')
...
从 Firebird 3 开始,您可以为此使用 substring
,使用其正则表达式工具(使用 similar
子句):
substring(v_accountno similar '[[:digit:]]*#"[[:alpha:]]*#"' escape '#')
另见 this dbfiddle。
我想实现一个从 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
将为 accountno 2 存储 H
,为 accountno 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
一个解决方案是用空字符串替换每个数字,例如:
o_letter = REPLACE(v_accountno, '0', '')
o_letter = REPLACE(o_letter, '1', '')
o_letter = REPLACE(o_letter, '2', '')
...
从 Firebird 3 开始,您可以为此使用 substring
,使用其正则表达式工具(使用 similar
子句):
substring(v_accountno similar '[[:digit:]]*#"[[:alpha:]]*#"' escape '#')
另见 this dbfiddle。