2016-07-11 13 views
-2

単純なクエリを実行すると演算子の不一致エラーが発生します。この原因は何ですか?私はenum12CREATE TYPE enum12 AS ENUM (...)で作成されたと仮定しますJDBC preStmt.setInt(1, Integer.parseInt(user));PostgresSQL ERROR:演算子が存在しません:enum12 =整数

dev_db=# \d+ registrants 
            Table "public.registrants" 
     Column |   Type   |  Modifiers  | Storage | Description 
    --------------+--------------------------+--------------------+----------+------------- 
    user   | enum12     | not null   | plain | 
    degree  | text      |     | extended | 
+0

'enum12'の定義は何ですか? –

+0

私は1をゲストユーザ、2を管理者と定義しました –

+1

数字に許可される値を制限するためにenumを使用しているのはなぜですか?それは意味をなさない。外部キーまたは検査制約付きの適切なルックアップテーブルを使用します。列挙型はこれに対して間違った選択です。 –

答えて

0

使用しています

問題は、整数を列挙型に自動的にキャストできないことです(しかし、文字列では機能します)。

あなた本当にを使用すると、以下のように使用することができ、enum12に整数をキャストできるようにする必要がある場合:

CREATE OR REPLACE FUNCTION int_to_enum12(integer) RETURNS enum12 
    LANGUAGE sql IMMUTABLE STRICT AS 
    $$SELECT enumlabel::enum12 
    FROM pg_catalog.pg_enum 
    WHERE enumsortorder = $1 
     AND enumtypid = 'enum12'::regtype$$; 

CREATE CAST (integer AS enum12) 
    WITH FUNCTION int_to_enum12(integer) 
    AS IMPLICIT; 

次に、あなたの例では、おそらく動作します。

注:

  • これは最初のラベルが '1' に対応することを前提としています。
  • 範囲外の整数は、NULLにキャストされます。以下のような複数のエラーにつながる、あなたのSQL文の曖昧さを増加しますデータベースへの暗黙的なキャストを追加
  • ERROR: operator is not unique: ... 
    HINT: Could not choose a best candidate operator. You might need to add explicit type casts. 
    

私はあなたが「ドンようにクエリを言い換えたほうが良いかもしれないと思いますタイプキャストが必要です。

+0

私は彼が実際にはこれのためにenumを使用していない方が良いかもしれないと思います。 –

関連する問題