Retornando apenas dígitos válidos de uma string

As vezes precisamos retirar de uma string apenas seus dígitos válidos, por exemplo, considere o numero de telefone informado como ‘(11)5555-4444’ e que tal pudéssemos ter apenas a porção numérica que nos interessa, ou seja, 1155554444?

Mas imagine ainda que no caso de um telefone alguém informe algo como ‘INTL +55(11)5555-4444’ e que nessa situação queremos apenas os dígitos numéricos, mas mantendo o “+” que é significativo para ligações internacionais deixando-o assim ‘+551155554444’.

Vamos imaginar mais uma vez, o telefone ainda é o mesmo, isto é, ‘INTL +55(11)5555-4444’, mas que dessa vez nos interessa além dos dígitos numéricos, também “+”, “(“. “)” e “-“deixando-o assim ‘+55(11)5555-4444’.

Claro que este foi apenas um exemplo com telefone, mas as aplicações são várias, especialmente para remover dígitos que não são interessantes em mascaras de CEP, CNPJ, CPF e outros. É para isso que criei a SQL Function chamada de STR_DIGITS:

create or alter function STR_DIGITS (
    AParam_Value varchar(255) = '',
    AValid_Digits varchar(127) = '0123456789')
returns varchar(255)
as
declare variable AReturn varchar(255);
declare variable iSizeOfString integer;
declare variable I integer;
declare variable sOnlyChar char(1);
BEGIN
  -- Retorna apenas os digitos desejados de uma string, ex:
  -- ret=Str_Digits('(11)5555-4444') // retorna 1155554444 porque o padrao é apenas os numeros
  -- Pode-se definir os caracteres validos, ex:
  -- ret=STR_DIGITS('INTL +55(11)5555-4444'); -- Retorna: '551155554444'
  -- ret=STR_DIGITS('INTL +55(11)5555-4444','+'); -- Retorna: '+551155554444'
  -- ret=STR_DIGITS('INTL +55(11)5555-4444','+-()'); -- Retorna: '+55(11)5555-4444'
  AReturn='';
  AParam_Value=trim(AParam_Value);

  iSizeOfString = octet_length(AParam_Value); -- character_length
  if ((AParam_Value<>'') and (iSizeOfString > 0)) then
  begin
    i = 1;
    while (i <= iSizeOfString) do
    begin
      sOnlyChar = substring (AParam_Value from i for 1);
      if ( position (sOnlyChar in AValid_Digits)>0 ) then
      begin
        AReturn = AReturn || sOnlyChar;
      end
      i = i + 1;
    end
  end
  return AReturn;
END

Como usar

STR_DIGITS('INTL +55(11)5555-4444'); -- Retorna: '551155554444'
STR_DIGITS('INTL +55(11)5555-4444','+'); -- Retorna: '+551155554444'
STR_DIGITS('INTL +55(11)5555-4444','+-()'); -- Retorna: '+55(11)5555-4444'
-- Selecionando clientes onde o CNPJ tenham traços e pontos
select a.razao_social, a.cnpj from clientes a
where str_digits(a.cnpj)='00000000000191'

Conclusão

Novamente é preciso ressaltar que usar para extrair numeros válidos de um telefone foi apenas um exemplo. As aplicações são ilimitadas, por exemplo remover dígitos que não são interessantes em mascaras de CEP, CNPJ, CPF e NCM.