4

このクエリを実行すると:

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を返します。

2つのバージョンの違いは誰でも知っていますか?

4

3 に答える 3

3

8.3.2の変更ログから:

(substring(string from pattern))正規表現の部分文字列マッチング(Tom)のコーナーケースを修正する
この問題は、パターン全体に一致するものの、ユーザーが括弧で囲まれた部分式を指定し、その部分式が一致しない場合に発生します。例はsubstring('foo' from 'foo(bar)?')です。一致していないため、これはNULLを返すはず(bar)ですが、代わりにパターン全体の一致を誤って返していました(つまり、foo

于 2013-03-24T22:24:07.617 に答える
1

正規表現()に切り替える場合~、ドロップイン置換は次のようになります。

SELECT 'Via Orologio 122 A' ~ '^(?:(?:Strada|Via) .* [0-9]+(?: [A-Z])?)$'
  • 左アンカーと右アンカー
  • *、ではなく+
  • 非キャプチャ括弧

ヒント:dba.SEの関連する回答で概説されている手法を使用して、Postgresに式を
翻訳させることができます。SIMILAR TO

于 2013-03-24T23:34:48.933 に答える
0

Craig Ringerのアドバイスに従い、次のように変更します。

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

問題を解決しました。「〜」は「SIMILARTO」よりも間違いなく優れたソリューションのようです

于 2013-03-24T23:02:04.590 に答える