2012-03-05 62 views
2

次のクエリエラーを考えてみましょう:のPostgreSQL 9.1.3:「オペレータ固有のものではありません」問題

db=# select 'test' || 123; 
ERROR: operator is not unique: unknown || integer 
LINE 1: select 'test' || 123; 
        ^
HINT: Could not choose a best candidate operator. You might need to add explicit type casts. 

db=# select 'test'::text || 123; 
ERROR: operator is not unique: text || integer 
LINE 1: select 'test'::text || 123; 
          ^
HINT: Could not choose a best candidate operator. You might need to add explicit type casts. 

さて、pgAdminでで、DBのための私のキャストのノードで、私は、のいずれかをそれらの13を定義しています次のとおりです。

CREATE CAST (integer AS text) 
    WITH FUNCTION text(integer) 
    AS IMPLICIT; 

私たちは、私がmethod described here次の暗黙的なキャストを再作成PG 9.1、に行ったとき。

私は実際に重複した演算子を作成したのかどうか、もしそうなら、どうすればそれを掃除するべきなのでしょうか?そうでない場合は、なぜこのようなエラーが発生しますか?それはむしろまっすぐ前方のキャストのようです。

ありがとうございます!

+4

'test'を選択してください。 123;テキストと整数を連結しようとしていますが、 'test'を選択してください:: text || 123; is not correct、テキストをテキストにキャストしてから整数で連結しようとしていますが、あなたがする必要があるのは次のようなものです:select 'test' || 123 :: text;これは動作します! – ComputerSaysNo

+0

明示するのは常にベストプラクティスです。 – Kuberchaun

答えて

1

同じキャストを追加しようとしましたが、9.1.2で同じエラーが表示されます。私はそのブログ(2009年2月24日付)の最初のコメントにもこのエラーが報告されています。

注:

これは、マニュアルの次のコメントとは何かを持っていることのPostgreSQL 8.3の前に、これらの機能は、静かに起因する存在に、だけでなく、いくつかの非文字列データ型の値を受け入れるだろうこれらのデータ型からテキストへの暗黙の強制変換これらの強制は頻繁に驚くべき振る舞いを引き起こしたため削除されています。 しかし、少なくとも1つの入力が文字列型である限り、文字列連結演算子(||)は文字列以外の入力を受け入れます。

私は暗黙のキャストを追加することで複写演算子を作成していると思います。整数をテキストにキャストし、text || textを使用するかどうかを指定し、text || integerを使用します。テーブルを見ると、2番目はtext || anynonarrayであり、落とすことはできません。

要するに、この問題を解決する唯一の方法は、||演算子またはは、作成した暗黙のキャストを削除し、elseのすべての場所で明示的なキャストを使用します。

+0

演算子||(テキスト、anynonarray)を削除することはありますか?私は明示的なキャストを何百ものクエリの周りに置くことができません。 –

+0

番号私はこれを結びつけましたが、それは組み込まれており、変更または削除することはできません。 –

0

1つのエラーを解決するためにどこに問題があるのでしょうか?それらの古い暗黙的なキャストを追加する必要がありますが、そのような場所でエラーが発生しました。 '/%';クエリは、ユニークでない演算子のエラーをスローする、私はテキストキャストとして整数をドロップしなければならなかった。

関連する問題