我正在编写一个PostgreSQL函数,以计算特定文本子字符串在另一段文本中出现的次数。例如,调用count(’foobarbaz’,’ba’)应该返回2。
我了解要测试子字符串是否出现,我使用类似于以下的条件:
WHERE 'foobarbaz' like '%ba%'
但是,我需要它返回“ ba”发生次数的2。我该如何进行?
在此先感谢您的帮助。
选择的答案被证明比改版的慢得多regexp_replace()。创建行以及运行聚合的开销实在太高了。
regexp_replace()
最快的方法如下:
SELECT (length(str) - length(replace(str, replacestr, '')) )::int / length(replacestr) FROM ( VALUES ('foobarbaz', 'ba') ) AS t(str, replacestr);
在这里,我们
L1
L2
L3
为了进行比较,它比使用这种方法的 速度快 大约 五倍regexp_matches()。
regexp_matches()
SELECT count(*) FROM ( VALUES ('foobarbaz', 'ba') ) AS t(str, replacestr) CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');