PostgreSQL查询以查找字符串中子字符串的出现次数
我正试图解决一个问题,但我遇到了一个空白。我非常了解SQL,但我不知道如何处理这个问题 我的问题是: 给定一个字符串和一个可能的子字符串表,我需要找到出现的次数 搜索表由单个列组成: 搜索表 考虑到弦地球是我的家园,也是我朋友们居住的地方,预期结果是我和地球的3倍和1倍 在我的函数中,我有一个变量bodytext,它是要检查的字符串PostgreSQL查询以查找字符串中子字符串的出现次数,sql,postgresql,Sql,Postgresql,我正试图解决一个问题,但我遇到了一个空白。我非常了解SQL,但我不知道如何处理这个问题 我的问题是: 给定一个字符串和一个可能的子字符串表,我需要找到出现的次数 搜索表由单个列组成: 搜索表 考虑到弦地球是我的家园,也是我朋友们居住的地方,预期结果是我和地球的3倍和1倍 在我的函数中,我有一个变量bodytext,它是要检查的字符串 我知道我可以从searchtable中选择模式来获取子字符串列表,我也可以使用LIKE ANY子句来获取匹配项,但如何计算搜索字符串中表中子字符串的出现次数?我用以
我知道我可以从searchtable中选择模式来获取子字符串列表,我也可以使用LIKE ANY子句来获取匹配项,但如何计算搜索字符串中表中子字符串的出现次数?我用以下代码解决了问题:
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;
无需自定义函数即可轻松完成此操作:
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;
这会将所有模式填充到正则表达式中。并不是说这个版本不考虑分词
是dbfiddle。请包含函数的实际代码。如何在搜索字符串中计算表中子字符串的出现次数?不算数。算算吧。伪代码:lengthoriginl string-lengthreplaceoriginal string,substring,/lengthsubstring@ZoharPeled在发布问题后不久,我自己解决了这个问题,但我使用的正是这种方法。我将发布完整的解决方案以供参考。@a_horse_与_no_同名,我将更新它,以防其他人遇到问题。如前所述,该表实际上只有一列。
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;