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
- Toma la longitud de la cadena,
L1
- Restar de
L1
la longitud de la cadena con todos los reemplazos eliminadosL2
para obtenerL3
la diferencia en la longitud de la cadena. - 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');