PostgreSQL 8.4中的字符串匹配

时间:2015-04-02 07:27:23

标签: regex postgresql postgresql-8.4

我需要在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.2K14.1.Z.13.A2等,因为模式是由用户提供的。应用程序无法控制模式(它不是版本号)。

知道如何在Postgres 8.4中实现这一点吗?

再问一个问题后,我的问题就解决了Escaping a LIKE pattern or regexp string in Postgres 8.4 inside a stored procedure

3 个答案:

答案 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

SQL Fiddle.

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

SQL Fiddle.

答案 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\..$';