2013-03-24 45 views
4

如果我運行此查詢:在正則表達式匹配中PostgreSQL 8.3到9.2改變了什麼?

SELECT 'Via Orologio 122 A' SIMILAR TO '(Strada|Via) % [0-9]+([A-Z])?'; 

我期望得到TRUE。 postgreSQL的版本9.1.8返回期望的值,但是在版本8.3中返回FALSE。我認爲問題是最後的問號。實際上,查詢:

SELECT 'Via Orologio 122 A' SIMILAR TO '(Strada|Via) % [0-9]+([A-Z])'; 

在兩個版本中都返回TRUE。

任何人都知道這兩個版本之間的區別是什麼?

+4

'相似TO'不使用正則表達式正確,它使用SQL標準規定的bastardised形式。 PostgreSQL只支持它,因爲標準說它應該。在簡單的'LIKE'不足的地方使用'〜'運算符。至於發生了什麼變化:看起來像是與我「相似」的錯誤修正,但您應該查看細節中的註釋和git歷史記錄。 – 2013-03-24 22:12:45

+1

哪個版本8.3? – 1ac0 2013-03-24 22:24:28

+2

實際上,[Postgres在內部重寫'SIMILAR TO'到正則表達式](http://dba.stackexchange.com/questions/10694/pattern-matching-with-like-similar-to-or-regular-expressions-in- PostgreSQL的/ 10696#10696)。換句話說:對於每個「SIMILAR TO」,至少有一個'〜'表達式更快。 *如果*您可以'LIKE'來代替,那可能會更快。 – 2013-03-24 22:55:34

回答

3

changelog of 8.3.2

修復一個角落的情況下在正則表達式子串匹配 (substring(string from pattern))(TOM)
當存在 匹配到整體的模式,但用戶已經指定一個 時發生該問題括號內的子表達式和該子表達式沒有匹配。 一個例子是substring('foo' from 'foo(bar)?')。這應返回 NULL,因爲(bar)不匹配,但它是錯誤的返回 全模式匹配,而不是(即foo

+0

+1閱讀文檔 – 2013-03-24 22:26:18

+0

非常善良的你潛入整個文件。我評論而不是回答,正是因爲我不是真的想爲他們做OP的RTFMing。 – 2013-03-24 22:55:39

+2

提供源代碼非常好。但是錯誤地引用並不是很好 - 或者根本不引用。你做到了。這是來自8.3.2的更新日誌。 – 2013-03-24 23:02:08

0

繼克雷格·林格建議,更改爲:

SELECT 'Via Orologio 122 A' ~ '(Strada|Via) .+ [0-9]+([A-Z])?'; 

解決了這個問題。 「〜」似乎比「類似於」一個肯定更好溶液

1

當切換到一個正則表達式(~)中,簡易替換將是:

SELECT 'Via Orologio 122 A' ~ '^(?:(?:Strada|Via) .* [0-9]+(?: [A-Z])?)$' 
  • 左錨和右錨
  • *,不+
  • 非捕獲括號

提示:
你可以讓Postgres的翻譯SIMILAR TO表達你與technique outlined in tis related answer on dba.SE.