我正在编写一个PostgreSQL函数来计算特定文本子字符串在另一段文本中出现的次数.例如,调用count('foobarbaz','ba')应返回2.
我理解为了测试子串是否出现,我使用类似于下面的条件:
WHERE 'foobarbaz' like '%ba%'
Run Code Online (Sandbox Code Playgroud)
但是,我需要它以'ba'出现的次数返回2.我该怎么办?
在此先感谢您的帮助.
我强烈建议查看我发布的答案"如何使用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)
在这里,我们
L1
L1
所有替换项的字符串长度,L2
以获得L3
字符串长度的差异.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)
如何使用正则表达式:
SELECT count(*)
FROM regexp_matches('foobarbaz', 'ba', 'g');
Run Code Online (Sandbox Code Playgroud)
该'g'
标志在字符串上重复多个匹配(不仅仅是第一个).
归档时间: |
|
查看次数: |
8484 次 |
最近记录: |