Mesmo teretêtê, que foi publicado no artigo Remover Letras em campos do Postgres, publicado no blog O Peregrino (http://emersonhermann.blogspot.com) para o SGBD SQL Server, só que dessa vez para o SGBD Postgres ... :)
Vez por outra, precisamos de fazer uso de campos concatenados com números e strings e em alguns casos só procisamos
dos números nos joins ou em ETL para extração de dados.
Poderiamos simplesmente usar a function substring se o campo string fosse de tamanho fixo, e nesses casos a coisa complica.
A exemplo, um campo nome id_tabela de uma tabela qualquer, em algumas ocorrencias, isto é, linhas o id_tabela está ABCZ00001
e em outra ZCBA00002X, e uma outra linha também poderia está preenchida dessa forma ABZ00003.
Então sendo assim:
Aqui segue a dica, de uma function desenvolvida em PL/pgSQL que resolve esse problema:
-- -- Nome Artefato/Programa..: sp_rm_letters_pg.sql -- Autor(es)...............: Emerson Hermann (emersonhermann at gmail.com) O Peregrino http://emersonhermann.blogspot.com -- Data Inicio ............: 25/07/2011 -- Data Atual..............: 16/08/2011 -- Versao..................: 0.03 -- Compilador/Interpretador: PostgreSql -- Sistemas Operacionais...: Linux/Windows -- SGBD....................: PostgreSql 8.x/9.x -- Kernel..................: Nao informado! -- Finalidade..............: store procedure (function) para remever letras das strings -- OBS.....................: -- -- DROP FUNCTION IF EXISTS sp_rm_letters(number text); CREATE OR REPLACE FUNCTION sp_rm_letters(number text) RETURNS text AS $$ DECLARE c integer; number_r text; BEGIN c := 65; number_r := number; --até 126, isto é, mais 62, contempla os caracteres padrão ANSI original, até 255 (191) contempla o ASCII extendido . WHILE c<(65+62) LOOP number_r := replace(number_r,chr(c),''); c := c + 1; END LOOP; RETURN(number_r); END; $$ LANGUAGE 'plpgsql' STABLE CALLED ON NULL INPUT SECURITY INVOKER; /* -- Abaixo, letras, caracteres que serão removidos da string, pela function sp_rm_letters: ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~áàâãäéèêëíìïóòôõöúùûüÁÀÂÃÄÉÈÊËÍÌÏÓÒÔÕÖÚÙÛÜçÇ -- Chamado a função SELECT sp_rm_letters('ABC123Z4') -- Retorno 1234 -- Ou SELECT sp_rm_letters('éab~Z|||zcABC123éáúZ4'||chr(127)) -- Retorno 1234 -- Ou SELECT sp_rm_letters('ABC123Z4'); -- Retorno 1234 -- A função sp_rm_letters não remove caracteres especiais mas pode ser combinada com a function sp_rm_special_chars, para remover caracteres especiais. select sp_rm_special_chars(sp_rm_letters('éab~Z|||zcABC123éáúZ4z2'||chr(127))); -- Uma implementação da função SELECT * FROM tabela1 t1 JOIN tabela2 t2 ON t1.id_campo=sp_rm_letters(t2.id_campo); */
Que DEUS abençoe o Postgres e quem trabalha com o mesmo!
Valeu!
Nenhum comentário:
Postar um comentário