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
L1
subtrahieren die Länge der Zeichenfolge mit allen entfernten ErsetzungenL2
umL3
zu erhalten der Unterschied in der Stringlänge. - Teilen Sie
L3
durch 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');