选择的答案被证明比改版的慢得多
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');


