繁体   English   中英

PostgreSQL SQL 查询查找字符串中 substring 的出现次数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM