Ich würde dringend empfehlen, sich diese Antwort anzusehen, die ich zu "Wie zählen Sie die Vorkommen einer verankerten Zeichenfolge mit PostgreSQL?" gepostet habe . Die gewählte Antwort war massiv langsamer als eine angepasste Version von regexp_replace() . Der Aufwand für das Erstellen der Zeilen und das Ausführen des Aggregats ist einfach zu hoch.
Am schnellsten geht das wie folgt...
SELECT
(length(str) - length(replace(str, replacestr, '')) )::int
/ length(replacestr)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr);
Hier sind wir
- Nehmen Sie die Länge der Zeichenfolge,
L1 - Von
L1subtrahieren die Länge der Zeichenfolge mit allen entfernten ErsetzungenL2umL3zu erhalten der Unterschied in der Stringlänge. - Teilen Sie
L3durch die Länge der Ersetzung, um die Vorkommen zu erhalten
Zum Vergleich:Das ist etwa fünfmal schneller als die Methode der Verwendung von regexp_matches() das sieht so aus.
SELECT count(*)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');