PostgreSQL 8.4中的字符串匹配

Nan*_*r V 0 regex postgresql postgresql-8.4

我需要在PostgreSQL 8.4中实现一个正则表达式(据我所知)匹配.似乎正则表达式匹配仅在9.0+中可用.

我的需求是:

当我提供输入时,14.1我需要得到这些结果:

14.1.1
14.1.2
14.1.Z
...
Run Code Online (Sandbox Code Playgroud)

但排除:

14.1.1.1
14.1.1.K
14.1.Z.3.A
...
Run Code Online (Sandbox Code Playgroud)

该模式不限于单个字符.总有一种可能性,像这样的格局将呈现:14.1.1.2K,14.1.Z.13.A2等等,因为该模式提供给用户.应用程序无法控制模式(它不是版本号).

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

再问一个问题我的问题解决了在存储过程中的Postgres 8.4中转义LIKE模式或regexp字符串

Erw*_*ter 5

首先,至少从版本7.1开始,正则表达式匹配几乎一直在Postgres中使用.使用这些运算符:

~ !~ ~* !~*
Run Code Online (Sandbox Code Playgroud)

dba.SE概述:

你的情况似乎是,不允许另一个点:

SELECT *
FROM   tbl
WHERE  version LIKE '14.1.%'        -- for performance
AND    version ~ '^14\.1\.[^.]+$';  -- for correct result
Run Code Online (Sandbox Code Playgroud)

SQL小提琴.

LIKE表达式是多余的,但它会极大地提高性能,即使没有索引.但是你当然应该有一个索引.

LIKE表达可以使用一个基本text_pattern_ops索引,而正则表达式不能,至少在Postgres的8.4.

[^.]在正则表达式模式中是一个排除dot(.)的字符类.所以任何其他角色都是允许的,只是不再有点.

性能

要挤出此特定查询的最佳性能,您可以添加专门的索引:

CREATE INDEX tbl_specail_idx ON tbl
((length(version) - length(replace(version, '.', ''))), version text_pattern_ops);
Run Code Online (Sandbox Code Playgroud)

并使用匹配的查询,与上面相同,只需将最后一行替换为:

AND   length(version) - length(replace(version, '.', '')) = 2
Run Code Online (Sandbox Code Playgroud)

SQL小提琴.