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

时间:2016-06-03 23:24:53

标签: sql regex postgresql pattern-matching

我使用下面的查询来获取具有my_regex_pattern的内容行。但是,我不知道每一行模式的次数。在Postgres的每一行获得匹配计数的最佳方法是什么?

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

SELECT content
FROM table1
WHERE content ~ 'my_regex_pattern'

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

1 个答案:

答案 0 :(得分:2)

当然,您可以使用regexp_matches()。或者更好,regexp_split_to_table()。要应用于整个表,请使用LATERAL联接(需要Postgres 9.3 +):

SELECT content, ct
FROM   table1 t, LATERAL (
   SELECT count(*) - 1 AS ct
   FROM   regexp_split_to_table(t.content, 'abc')
   ) c
WHERE  t.content ~ 'abc';  -- eliminate rows without match

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

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

通常更快,因为正则表达式功能很昂贵。也适用于旧版本。