Consiglio vivamente di controllare questa risposta che ho pubblicato su "Come si contano le occorrenze di una stringa ancorata usando PostgreSQL?" . La risposta scelta si è rivelata molto più lenta di una versione adattata di regexp_replace()
. Il sovraccarico della creazione delle righe e l'esecuzione dell'aggregato sono semplicemente troppo elevati.
Il modo più veloce per farlo è il seguente...
SELECT
(length(str) - length(replace(str, replacestr, '')) )::int
/ length(replacestr)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr);
Eccoci
- Prendi la lunghezza della stringa,
L1
- Sottrai da
L1
la lunghezza della stringa con tutte le sostituzioni rimosseL2
per ottenereL3
la differenza nella lunghezza della stringa. - Dividi
L3
dalla lunghezza della sostituzione per ottenere le occorrenze
Per confronto, è circa cinque volte più veloce rispetto al metodo di utilizzo di regexp_matches()
che assomiglia a questo.
SELECT count(*)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');