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
- Ta längden på strängen,
L1
- Subtrahera från
L1
längden på strängen med alla ersättningar borttagnaL2
för att fåL3
skillnaden i stränglängd. - 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');