sql >> Databasteknik >  >> RDS >> PostgreSQL

PostgreSQL antal gånger delsträng förekommer i text

Jag rekommenderar starkt att du kollar in det här svaret jag postade på "Hur räknar du förekomsterna av en förankrad sträng med PostgreSQL?" . Det valda svaret visade sig vara mycket långsammare än en anpassad version av regexp_replace() . Omkostnaderna för att skapa raderna och köra aggregatet är helt enkelt för högt.

Det snabbaste sättet att göra detta är enligt följande...

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

Här är vi

  1. Ta längden på strängen, L1
  2. Subtrahera från L1 längden på strängen med alla ersättningar borttagna L2 för att få L3 skillnaden i stränglängd.
  3. Dela L3 efter längden på ersättningen för att få förekomsterna

Som jämförelse är det ungefär fem gånger snabbare än metoden att använda regexp_matches() som ser ut så här.

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


  1. Optimistisk samtidighet:IsConcurrencyToken och RowVersion

  2. Importera CSV till MySQL

  3. Hur man lägger till en DEFAULT-begränsning till en befintlig kolumn i SQL Server

  4. Kan vi omfördela Oracle tools.jar?