sql >> Base de Datos >  >> RDS >> PostgreSQL

PostgreSQL cuenta el número de veces que aparece una subcadena en el texto

Recomiendo encarecidamente que consulte esta respuesta que publiqué en "¿Cómo se cuentan las ocurrencias de una cadena anclada usando PostgreSQL?" . Se demostró que la respuesta elegida era mucho más lenta que una versión adaptada de regexp_replace() . La sobrecarga de crear las filas y ejecutar el agregado es simplemente demasiado alta.

La forma más rápida de hacerlo es la siguiente...

SELECT
  (length(str) - length(replace(str, replacestr, '')) )::int
  / length(replacestr)
FROM ( VALUES
  ('foobarbaz', 'ba')
) AS t(str, replacestr);

Aquí nosotros

  1. Toma la longitud de la cadena, L1
  2. Restar de L1 la longitud de la cadena con todos los reemplazos eliminados L2 para obtener L3 la diferencia en la longitud de la cadena.
  3. Dividir L3 por la longitud del reemplazo para obtener las ocurrencias

En comparación, eso es aproximadamente cinco veces más rápido que el método de usar regexp_matches() que se parece a esto.

SELECT count(*)
FROM ( VALUES
  ('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');