2016-07-11 2 views
-2

Получение ошибки несоответствия оператора при выполнении простого запроса. Что вызывает это?PostgresSQL ERROR: оператора не существует: enum12 = integer

Я использую JDBC preStmt.setInt(1, Integer.parseInt(user));

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 - admin –

+1

Почему вы используете перечисление для ограничения допустимых значений для числа? Это не имеет смысла. Используйте правильную таблицу поиска с внешним ключом или контрольным ограничением. Перечисление является неправильным выбором для этого. –

ответ

0

я буду считать, что enum12 была создана с CREATE TYPE enum12 AS ENUM (...).

Проблема заключается в том, что вы не можете автоматически отличать целые числа к перечисленному типу данных (но он работает для строк).

Если вы действительно должны быть в состоянии бросить целые числа в 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.
  • Добавление неявных приведений в базе данных увеличит двусмысленности ваших операторов, что приводит к увеличению количества ошибок, как:

    ERROR: operator is not unique: ... 
    HINT: Could not choose a best candidate operator. You might need to add explicit type casts. 
    

Я думаю, что вы могли бы быть лучше перефразировать запрос таким образом, что вы не» t нужен тип.

+0

Я думаю, что он может быть лучше не (ab), используя перечисления для этого. –

Смежные вопросы