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

时间:2014-09-10 04:15:49

标签: sql postgresql

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

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

    WHERE 'foobarbaz' like '%ba%'

然而,我需要它返回2次的次数' ba'发生。我该怎么办?

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:6)

如何使用正则表达式:

SELECT count(*)
FROM regexp_matches('foobarbaz', 'ba', 'g');

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

答案 1 :(得分:6)

我强烈建议查看我发布到"How do you count the occurrences of an anchored string using PostgreSQL?"的答案。所选择的答案显示比regexp_replace()的改编版本慢得多。创建行的开销和运行聚合的开销实在太高了。

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

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

我们

  1. 取字符串L1
  2. 的长度
  3. L1减去所有已删除的替换L2的字符串长度,以获得L3字符串长度的差异。
  4. L3除以替换的长度以获取出现次数
  5. 用于比较使用regexp_matches()的方法 的比较

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

答案 2 :(得分:0)

There is a

str_count( src,  occurence )

function based on

SELECT (length( str ) - length(replace( str, occurrence, '' ))) / length( occurence )

and a

str_countm( src, regexp )

based on the @MikeT-mentioned

SELECT count(*) FROM regexp_matches( str, regexp, 'g')

available here: postgres-utils

答案 3 :(得分:0)

尝试:

SELECT array_length (string_to_array ('1524215121518546516323203210856879', '1'), 1) - 1

--RESULT: 7