如何使用 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