我使用下面的查询来获取具有my_regex_pattern的内容行。但是,我不知道每一行模式的次数。在Postgres的每一行获得匹配计数的最佳方法是什么?
例如,如果某行的内容是' abcdefabcgh'我的正则表达式是' abc',我想要2,因为&abcdefabcgh'有两个' abc'
SELECT content
FROM table1
WHERE content ~ 'my_regex_pattern'
或者我如何获得匹配超过特定数字的行。例如,只给我一些abc超过4次的记录。
答案 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%';
通常更快,因为正则表达式功能很昂贵。也适用于旧版本。