Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL查询以查找字符串中子字符串的出现次数_Sql_Postgresql - Fatal编程技术网

PostgreSQL查询以查找字符串中子字符串的出现次数

PostgreSQL查询以查找字符串中子字符串的出现次数,sql,postgresql,Sql,Postgresql,我正试图解决一个问题,但我遇到了一个空白。我非常了解SQL,但我不知道如何处理这个问题 我的问题是: 给定一个字符串和一个可能的子字符串表,我需要找到出现的次数 搜索表由单个列组成: 搜索表 考虑到弦地球是我的家园,也是我朋友们居住的地方,预期结果是我和地球的3倍和1倍 在我的函数中,我有一个变量bodytext,它是要检查的字符串 我知道我可以从searchtable中选择模式来获取子字符串列表,我也可以使用LIKE ANY子句来获取匹配项,但如何计算搜索字符串中表中子字符串的出现次数?我用以

我正试图解决一个问题,但我遇到了一个空白。我非常了解SQL,但我不知道如何处理这个问题

我的问题是:

给定一个字符串和一个可能的子字符串表,我需要找到出现的次数

搜索表由单个列组成:

搜索表

考虑到弦地球是我的家园,也是我朋友们居住的地方,预期结果是我和地球的3倍和1倍

在我的函数中,我有一个变量bodytext,它是要检查的字符串


我知道我可以从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;