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

Ton*_*uan 3 sql postgresql

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

我理解为了测试子串是否出现,我使用类似于下面的条件:

    WHERE 'foobarbaz' like '%ba%'
Run Code Online (Sandbox Code Playgroud)

但是,我需要它以'ba'出现的次数返回2.我该怎么办?

在此先感谢您的帮助.

Eva*_*oll 7

我强烈建议查看我发布的答案"如何使用PostgreSQL计算锚定字符串的出现次数?" .所选择的答案显示出比改编版本慢得多regexp_replace().创建行的开销和运行聚合只是太高了.

最快的方法如下......

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

在这里,我们

  1. 取字符串的长度, L1
  2. 减去L1所有替换项的字符串长度,L2以获得L3字符串长度的差异.
  3. 除以L3替换的长度以获得发生

相比之下,这比使用的方法快5倍左右regexp_matches().

SELECT count(*)
FROM ( VALUES
  ('foobarbaz', 'ba')
) AS t(str, replacestr)
CROSS JOIN LATERAL regexp_matches(str, replacestr, 'g');
Run Code Online (Sandbox Code Playgroud)


Mik*_*e T 6

如何使用正则表达式:

SELECT count(*)
FROM regexp_matches('foobarbaz', 'ba', 'g');
Run Code Online (Sandbox Code Playgroud)

'g'标志在字符串上重复多个匹配(不仅仅是第一个).