Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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
Sql 每行正则表达式的匹配计数_Sql_Regex_Postgresql_Pattern Matching - Fatal编程技术网

Sql 每行正则表达式的匹配计数

Sql 每行正则表达式的匹配计数,sql,regex,postgresql,pattern-matching,Sql,Regex,Postgresql,Pattern Matching,我使用下面的查询来获取具有我的正则表达式模式的内容行。但我不知道每一行的模式命中了多少次。在Postgres中获得每行匹配计数的最佳方法是什么 例如,如果一行的内容是'abcdefabcgh',我的正则表达式是'abc',我想要2,因为'abcdefabcgh'有两个'abc' SELECT content FROM table1 WHERE content ~ 'my_regex_pattern' 或者,如何获取匹配项超过特定数字的行。例如,只需给我abc超过4次的记录。当然,您可以使用re

我使用下面的查询来获取具有我的正则表达式模式的内容行。但我不知道每一行的模式命中了多少次。在Postgres中获得每行匹配计数的最佳方法是什么

例如,如果一行的内容是'abcdefabcgh',我的正则表达式是'abc',我想要2,因为'abcdefabcgh'有两个'abc'

SELECT content
FROM table1
WHERE content ~ 'my_regex_pattern'

或者,如何获取匹配项超过特定数字的行。例如,只需给我abc超过4次的记录。

当然,您可以使用
regexp\u matches()
。或者更好。若要应用于整个表格,请使用
横向连接(需要Postgres 9.3+):

对于问题示例中的简单模式,您还可以:

SELECT content, (length(content) - length(replace(content, 'abc', ''))) / length('abc')
FROM   table1
WHERE  content LIKE '%abc%';

通常更快,因为正则表达式函数的成本很高。也适用于旧版本。

它的可能重复肯定是SO问题的重复,但这可能更相关:我认为regexp_匹配而不是~解决了我的问题。
SELECT content, (length(content) - length(replace(content, 'abc', ''))) / length('abc')
FROM   table1
WHERE  content LIKE '%abc%';