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
...
但排除:
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中实现这一点吗?
再问一个问题我的问题解决了在存储过程中的Postgres 8.4中转义LIKE模式或regexp字符串
首先,至少从版本7.1开始,正则表达式匹配几乎一直在Postgres中使用.使用这些运算符:
~ !~ ~* !~*
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.
[^.]在正则表达式模式中是一个排除dot(.)的字符类.所以任何其他角色都是允许的,只是不再有点.
要挤出此特定查询的最佳性能,您可以添加专门的索引:
CREATE INDEX tbl_specail_idx ON tbl
((length(version) - length(replace(version, '.', ''))), version text_pattern_ops);
并使用匹配的查询,与上面相同,只需将最后一行替换为:
AND   length(version) - length(replace(version, '.', '')) = 2
| 归档时间: | 
 | 
| 查看次数: | 1192 次 | 
| 最近记录: |