我正在编写PostgreSQL函数来计算特定文本子字符串在另一段文本中出现的次数。例如,呼叫计数(' foobarbaz',' ba')应返回2.
我理解为了测试是否出现子字符串,我使用类似于下面的条件:
WHERE 'foobarbaz' like '%ba%'
然而,我需要它返回2次的次数' ba'发生。我该怎么办?
提前感谢您的帮助。
答案 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);
我们
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');
答案 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