PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

PostgreSQL-Zähler, wie oft die Teilzeichenfolge im Text vorkommt

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

  1. Nehmen Sie die Länge der Zeichenfolge, L1
  2. Von L1 subtrahieren die Länge der Zeichenfolge mit allen entfernten Ersetzungen L2 um L3 zu erhalten der Unterschied in der Stringlänge.
  3. 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');