sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL-telling aantal keren dat subtekenreeks voorkomt in tekst

Ik raad je ten zeerste aan om dit antwoord te lezen dat ik heb gepost op "Hoe tel je het aantal keren dat een verankerde string voorkomt met PostgreSQL?" . Het gekozen antwoord bleek enorm langzamer te zijn dan een aangepaste versie van regexp_replace() . De overhead van het maken van de rijen en het uitvoeren van het aggregaat is gewoon te hoog.

De snelste manier om dit te doen is als volgt...

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

Hier zijn we

  1. Neem de lengte van de string, L1
  2. Aftrekken van L1 de lengte van de string met alle vervangingen verwijderd L2 om L3 . te krijgen het verschil in stringlengte.
  3. Verdeel L3 door de lengte van de vervanging om de voorvallen . te krijgen

Ter vergelijking:dat is ongeveer vijf keer sneller dan de methode van het gebruik van regexp_matches() die er zo uitziet.

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


  1. ODP.NET beheerd - Kan de gevraagde .Net Framework-gegevensprovider niet vinden

  2. Hoe het aantal seconden na middernacht in Oracle Database te retourneren?

  3. Dagelijks actieve gebruikers (DAU) berekenen in MySQL

  4. Oracle-vertraging tussen commit en select