一尘不染

PostgreSQL计算子字符串在文本中出现的次数

sql

我正在编写一个PostgreSQL函数,以计算特定文本子字符串在另一段文本中出现的次数。例如,调用count(’foobarbaz’,’ba’)应该返回2。

我了解要测试子字符串是否出现,我使用类似于以下的条件:

    WHERE 'foobarbaz' like '%ba%'

但是,我需要它返回“ ba”发生次数的2。我该如何进行?

在此先感谢您的帮助。


阅读 200

收藏
2021-03-10

共1个答案

一尘不染

选择的答案被证明比改版的慢得多regexp_replace()。创建行以及运行聚合的开销实在太高了。

最快的方法如下:

SELECT
  (length(str) - length(replace(str, replacestr, '')) )::int
  / length(replacestr)
FROM ( VALUES
  ('foobarbaz', 'ba')
) AS t(str, replacestr);

在这里,我们

  1. 取字符串的长度, L1
  2. L1字符串的长度中减去所有替换项后L2得到L3的字符串长度的差。
  3. L3由替换的长度,以获得 事件

为了进行比较,它比使用这种方法的 速度快 大约 五倍regexp_matches()

SELECT count(*)
FROM ( VALUES
  ('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');
2021-03-10