我需要在PostgreSQL 8.4中实现匹配的正则表达式(据我所知)。似乎正则表达式匹配仅在9.0 +中可用。
我的需求是:
当我提供输入14.1
时,我需要获得这些结果:
14.1.1
14.1.2
14.1.Z
...
但排除:
14.1.1.1
14.1.1.K
14.1.Z.3.A
...
模式不限于单个字符。总是有可能会出现这样的模式:14.1.1.2K
,14.1.Z.13.A2
等,因为模式是由用户提供的。应用程序无法控制模式(它不是版本号)。
知道如何在Postgres 8.4中实现这一点吗?
再问一个问题后,我的问题就解决了Escaping a LIKE pattern or regexp string in Postgres 8.4 inside a stored procedure
答案 0 :(得分:5)
首先,regular expression matching几乎一直在Postgres,至少从版本7.1开始。使用these operators:
~ !~ ~* !~*
dba.SE概述:
你的情况似乎是,不允许另一个点:
SELECT *
FROM tbl
WHERE version LIKE '14.1.%' -- for performance
AND version ~ '^14\.1\.[^.]+$'; -- for correct result
LIKE
表达式是多余的,但即使没有索引,它也会显着提高性能。但是你当然应该有一个索引。
LIKE
表达式可以使用基本的text_pattern_ops
索引,而正则表达式则不能,至少在Postgres 8.4中。
[^.]
是一个排除点(.
)的字符类。所以任何其他角色都是允许的,只是没有点。
要挤出此特定查询的最佳效果,您可以添加专门的索引:
CREATE INDEX tbl_specail_idx ON tbl
((length(version) - length(replace(version, '.', ''))), version text_pattern_ops);
使用匹配的查询,与上面相同,只需将最后一行替换为:
AND length(version) - length(replace(version, '.', '')) = 2
答案 1 :(得分:0)
你不能进行正则表达式匹配,但我相信你可以像运算符一样:
SELECT * FROM table WHERE version LIKE '14.1._';
将匹配版本为'14 .1的任何行。后跟一个字符。这应该与您的示例相匹配。请注意,如果您需要这个,那么这只会与'14 .1'不匹配。你可以用OR来做到这一点。
SELECT * FROM table WHERE version LIKE '14.1._' OR version = '14.1';
答案 2 :(得分:0)
使用Postgresql-8.4可以进行正则表达式匹配,如下所示:
SELECT * FROM table WHERE version ~ '^14\.1\..$';