Vřele doporučuji prostudovat si tuto odpověď, kterou jsem zveřejnil na „Jak počítáte výskyty ukotveného řetězce pomocí PostgreSQL?“ . Ukázalo se, že vybraná odpověď je výrazně pomalejší než upravená verze regexp_replace()
. Režie na vytváření řádků a provozování agregátu je prostě příliš vysoká.
Nejrychlejší způsob, jak to udělat, je následující...
SELECT
(length(str) - length(replace(str, replacestr, '')) )::int
/ length(replacestr)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr);
Tady jsme
- Vezměte délku řetězce,
L1
- Odečtěte od
L1
délka řetězce se všemi odstraněnými náhradamiL2
získatL3
rozdíl v délce řetězce. - Rozdělte
L3
podle délky nahrazení, abyste získali výskyty
Pro srovnání je to asi pětkrát rychlejší než metoda pomocí regexp_matches()
který vypadá takto.
SELECT count(*)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');