Силно бих препоръчал да разгледате този отговор, който публикувах в "Как се броят случаите на закотвен низ с помощта на PostgreSQL?" . Показано е, че избраният отговор е значително по-бавен от адаптирана версия на regexp_replace()
. Режийните разходи за създаване на редовете и изпълнението на агрегата са просто твърде големи.
Най-бързият начин да направите това е както следва...
SELECT
(length(str) - length(replace(str, replacestr, '')) )::int
/ length(replacestr)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr);
Ето ни
- Вземете дължината на низа,
L1
- Извадете от
L1
дължината на низа с всички отстранени заместванияL2
за да получитеL3
разликата в дължината на низа. - Разделете
L3
по дължината на замяната, за да получите събитията
За сравнение това е около пет пъти по-бързо отколкото метода за използване на regexp_matches()
което изглежда така.
SELECT count(*)
FROM ( VALUES
('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');