如果我运行这个查询:
SELECT 'Via Orologio 122 A' SIMILAR TO '(Strada|Via) % [0-9]+( [A-Z])?';
字符串
我希望得到真实。PostgreSQL 9.1.8版返回预期值,但在8.3版中返回FALSE。我认为问题是最后的问号。事实上,查询:
SELECT 'Via Orologio 122 A' SIMILAR TO '(Strada|Via) % [0-9]+( [A-Z])';
型
在两个版本中都返回TRUE。
有谁知道这两个版本的区别是什么?
3条答案
按热度按时间pokxtpni1#
changelog of 8.3.2:
修复正则表达式子字符串匹配
(substring(string from pattern))
中的一个角落情况(Tom)当模式总体上匹配,但用户指定了一个带括号的子表达式,而该子表达式没有匹配时,就会出现问题。一个例子是
substring('foo' from 'foo(bar)?')
。这应该返回NULL,因为(bar)
不匹配,但它错误地返回了整个模式匹配(即foo
)vsaztqbk2#
使用带有(
~
)的正则表达式的直接替换将是:字符串
*
,而不是+
提示:
您可以让Postgres使用technique outlined in this related answer on dba.SE.为您翻译
SIMILAR TO
表达式esyap4oy3#
根据克雷格Ringer的建议,更改为:
字符串
解决了问题'~'似乎是比'SIMILAR TO'更好的解决方案