Select 只有文本中的数字

Select only digits from Text

任何人都可以帮助我如何 select 仅来自文本的数字?

字符串可以是随机的,例如:

ABCD123DEF -> Result must be 123
393SEA981F -> Result must be 393981

谢谢!Firebird 版本是 2.5

我第一个想到的是:

将存储过程用作:

SET TERM ^ ;

create or alter procedure GET_DIGIT_ONLY (
    IPARAM varchar(32))
returns (
    OPARAM varchar(32))
as
declare variable I integer;
begin
  oparam = '';
  i = 1;
  while (i <= char_length(:iparam)) do
  begin
    if (substring(:iparam from i for 1) similar to '[0123456789]')  then
      oparam = :oparam || (substring(:iparam from i for 1));
    i = :i + 1;
  end
  suspend;
end^

SET TERM ; ^

使用方法:

execute procedure get_digit_only :input_param
returning_values :output_param

select get_digit_only.oparam from get_digit_only ('393SEA981F')

你可以创建执行块

EXECUTE BLOCK
RETURNS (number VARCHAR(20))
AS
  DECLARE VARIABLE temp VARCHAR(20);
  DECLARE VARIABLE temp_char VARCHAR(1);
  DECLARE VARIABLE step INT;
BEGIN
  FOR SELECT
    sometable.sometext
  FROM sometable
  INTO :temp DO
  BEGIN
    step = 1;
    number = '';
    WHILE (:step < CHAR_LENGTH(:temp)) DO
    BEGIN
      temp_char = SUBSTRING(:temp FROM step FOR 1);
      IF (POSITION(:temp_char IN '0123456789') > 0) THEN
        number = :number || :temp_char;

      step = step + 1;
    END
    SUSPEND;
  END
END

OR 存储过程,将 EXECUTE BLOCK 替换为 CREATE OR ALTER PROCEDURE SomeProcedure

EXECUTE BLOCK 是可运行的,STORED PROCEDURE 需要像

这样的调用
SELECT SomeProcedure.number
FROM SomeProcedure

如果您有脏数据源,这个 (Firebird 3.0) 函数可能会有帮助。

SET TERM ^ ;

CREATE OR ALTER FUNCTION GET_DIGIT_ONLY (IPARAM VARCHAR(15))
RETURNS INTEGER
AS
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE ONUM INTEGER;
DECLARE VARIABLE OPARAM VARCHAR(15);
DECLARE VARIABLE V_WORK VARCHAR(15);
BEGIN
    OPARAM = '';
    ONUM = 0;
    I = 1;
    V_WORK = TRIM(IPARAM);
    IF(V_WORK IS NULL) THEN
    BEGIN
        RETURN 0;
    END
    IF(TRIM(V_WORK) = '') THEN
    BEGIN
        RETURN 0;
    END
    WHILE (I <= CHAR_LENGTH(:V_WORK)) DO
    BEGIN
        IF (SUBSTRING(:V_WORK FROM I FOR 1) SIMILAR TO '[0123456789]')  THEN
            OPARAM = :OPARAM || (SUBSTRING(:V_WORK FROM I FOR 1));
        I = :I + 1;
    END
    IF(TRIM(:OPARAM) = '') THEN
    BEGIN
        RETURN 0;
    END
    ONUM = CAST(:OPARAM AS INTEGER);
    RETURN ONUM;
END;

SET TERM ; ^
;

遵循同样的想法,这里是一个仅提取字母字符的函数:

SET TERM ^ ;

CREATE OR ALTER FUNCTION GET_ALPHA_ONLY (IPARAM VARCHAR(15))
RETURNS VARCHAR(15)
AS
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE OPARAM VARCHAR(15);
DECLARE VARIABLE V_WORK VARCHAR(15);
BEGIN
    OPARAM = '';
    I = 1;
    V_WORK = TRIM(IPARAM);
    IF(V_WORK IS NULL) THEN
        BEGIN
        RETURN '@';
    END
    IF(TRIM(V_WORK) = '') THEN
    BEGIN
        RETURN '@';
    END
    WHILE (I <= CHAR_LENGTH(:V_WORK)) DO
    BEGIN
        IF (SUBSTRING(:V_WORK FROM I FOR 1) SIMILAR TO '[ABCDEFGHIJKLMNOPQRSTUVWXYZ]')  THEN
            OPARAM = :OPARAM || (SUBSTRING(:V_WORK FROM I FOR 1));
        I = :I + 1;
    END
    IF(TRIM(:OPARAM) = '') THEN
    BEGIN
        RETURN '@';
    END
    RETURN OPARAM;
END;

SET TERM ; ^
;