PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

O PostgreSQL conta o número de vezes que a substring ocorre no texto


Eu sugiro verificar esta resposta que postei em "Como você conta as ocorrências de uma string ancorada usando o PostgreSQL?" . A resposta escolhida mostrou ser massivamente mais lenta do que uma versão adaptada de regexp_replace() . A sobrecarga de criar as linhas e a execução da agregação é simplesmente muito alta.

A maneira mais rápida de fazer isso é a seguinte...
SELECT
  (length(str) - length(replace(str, replacestr, '')) )::int
  / length(replacestr)
FROM ( VALUES
  ('foobarbaz', 'ba')
) AS t(str, replacestr);

Aqui nós
  1. Pegue o comprimento da string, L1
  2. Subtrair de L1 o comprimento da string com todas as substituições removidas L2 para obter L3 a diferença no comprimento da string.
  3. Divida L3 pela duração da substituição para obter as ocorrências

Para comparação, é cerca de cinco vezes mais rápido do que o método de usar regexp_matches() que se parece com isso.
SELECT count(*)
FROM ( VALUES
  ('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');