PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

PostgreSQL compte le nombre de fois que la sous-chaîne apparaît dans le texte

Je vous suggère fortement de consulter cette réponse que j'ai publiée sur "Comment comptez-vous les occurrences d'une chaîne ancrée à l'aide de PostgreSQL ?" . La réponse choisie s'est avérée massivement plus lente qu'une version adaptée de regexp_replace() . La surcharge liée à la création des lignes et à l'exécution de l'agrégat est tout simplement trop élevée.

Le moyen le plus rapide de le faire est le suivant...

SELECT
  (length(str) - length(replace(str, replacestr, '')) )::int
  / length(replacestr)
FROM ( VALUES
  ('foobarbaz', 'ba')
) AS t(str, replacestr);

Ici nous

  1. Prenez la longueur de la chaîne, L1
  2. Soustraire de L1 la longueur de la chaîne avec tous les remplacements supprimés L2 pour obtenir L3 la différence de longueur de chaîne.
  3. Diviser L3 par la longueur du remplacement pour obtenir les occurrences

À titre de comparaison, c'est environ cinq fois plus rapide que la méthode d'utilisation de regexp_matches() qui ressemble à ceci.

SELECT count(*)
FROM ( VALUES
  ('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');