Eu tenho uma concatenação de substituições de strings desta maneira:
CREATE OR REPLACE FUNCTION norm(t text) RETURNS text AS $$
declare t1 text;
declare t2 text;
...
declare t10 text;
BEGIN
select replace (lower(t), ',', ' ') into t1;
select regexp_replace (t1, '[^0-9a-z\s-]', '', 'g') into t2;
...
select regexp_replace (t10, 'n?oise?.*', '', 'g') into t10;
RETURN trim(t10);
END;
$$ LANGUAGE plpgsql;
Atualmente conta com 10 operações diferentes e o número não para de crescer. Também tem o inconveniente de mudar de posição para transformações forçar a renomear variáveis.
Existe uma maneira melhor de gerenciar essa situação?
Com
plperlu
eRegexp::Assemble
Depende do comprimento da string e do comprimento da entrada. Você pode criar um regexp totalmente otimizado, usando Regexp::Assemble do Perl e executá-lo com plperlu.
O código abaixo armazena em cache o regex para toda a sessão, portanto, as chamadas subsequentes devem ser rápidas.
Agora você pode chamá-lo com,
Alternativamente, você hardcore os regexes lá, mas se você for fazer isso, você também pode cortar
Regexp::Assemble
e colar um regex pré-compilado.Com
plperl
Velocidade
Para este exemplo, peguei os seguintes dados de amostra, que são 300.000 linhas
Para comparação, a versão acima de @joanolo leva 8,04 segundos
Usando plperl com,
Leva 5,0 segundos.
Você pode se ajudar com uma
replacements
mesa:Que você preencheria com quantas substituições você precisasse realizar:
E então mude sua função para usá-la:
E confira os resultados:
Isso não será tão rápido quanto codificar todas as alterações em sua função, mas permitirá maior flexibilidade.
Como alternativa, você pode simplesmente alterar a estrutura de código da sua função e reutilizar a mesma variável mais de uma vez 1 :
Isso é mais rápido e a melhor alternativa se o número de substituições for moderado.
Você pode verificá-lo no dbfiddle aqui
1) PLPGSQL não é uma linguagem funcional que obriga você a atribuir apenas uma vez a
val
s, as variáveis podem ser sobrescritas quantas vezes forem necessárias. Se você pensar em termos de Scala , eles sãovar
s, nãoval
s. Em termos de Java, eles não sãoimmutable
.