PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL conta il numero di volte in cui la sottostringa si verifica nel testo

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

  1. Prendi la lunghezza della stringa, L1
  2. Sottrai da L1 la lunghezza della stringa con tutte le sostituzioni rimosse L2 per ottenere L3 la differenza nella lunghezza della stringa.
  3. 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');