[英]Counting the number of occurrences of a substring within a string in PostgreSQL
[英]PostgreSQL SQL query to find number of occurrences of substring in string
我正试图解决一个问题,但我一头雾水。 我非常了解 SQL,但我不确定如何处理。
我的问题:
给定一个字符串和一个可能的子字符串表,我需要找出出现的次数。
搜索表由一个列组成:
搜索表
| pattern TEXT PRIMARY KEY| |-------------------------| | my | | quick | | Earth |
给定字符串“Earth is my home pl.net and where my friends live”,预期结果为 3(2x“my”和 1x“Earth”)。
在我的 function 中,我有变量正文,它是要检查的字符串。
我知道我可以执行 IN (SELECT pattern FROM searchtable) 来获取子字符串列表,并且我可以使用 LIKE ANY 子句来获取匹配项,但是如何计算搜索字符串中表中子字符串的出现次数?
无需自定义 function 即可轻松完成此操作:
select count(*)
from (values ('Earth is my home planet and where my friends live')) v(str) cross join lateral
regexp_split_to_table(v.str, ' ') word join
patterns p
on word = p.pattern
只需将原始字符串分解为“单词”即可。 然后匹配单词。
另一种方法使用正则表达式匹配:
select (select count(*) from regexp_matches(v.str, p.rpattern, 'g'))
from (values ('Earth is my home planet and where my friends live')) v(str) cross join
(select string_agg(pattern, '|') as rpattern
from patterns
) p;
这会将所有模式填充到一个正则表达式中。 并不是说这个版本不考虑分词。
这是一个 db<>fiddle。
我用下面的代码解决了这个问题:
CREATE OR REPLACE FUNCTION count_matches(body TEXT, OUT matches INTEGER) AS $$
DECLARE
results INTEGER := 0;
matchlist RECORD;
BEGIN
FOR matchlist IN (SELECT pattern FROM searchtable)
LOOP
results := results + (SELECT LENGTH(body) -
LENGTH(REPLACE(body, matchlist.pattern, ''))) /
LENGTH(matchlist.pattern);
END LOOP;
matches := results;
END;
$$ LANGUAGE plpgsql;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.