【问题标题】:PostgreSQL ERROR: operator does not exist: enum12 = integerPostgreSQL 错误:运算符不存在:enum12 = 整数
【发布时间】:2016-11-13 05:37:56
【问题描述】:

执行简单查询时出现运算符不匹配错误。这是什么原因造成的?

我正在使用 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 |

【问题讨论】:

  • enum12的定义是什么?
  • 我已经定义 1 是访客用户,2 是管理员
  • 为什么要使用枚举来限制数字的允许值?那没有意义。使用带有外键或检查约束的正确查找表。枚举是错误的选择。

标签: java postgresql jdbc


【解决方案1】:

我假设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
  • 向数据库添加隐式转换会增加 SQL 语句的歧义,从而导致更多错误,例如:

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

我认为你最好改写查询,这样你就不需要类型转换了。

【讨论】:

  • 我认为他实际上最好不要(ab)为此使用枚举。
猜你喜欢
  • 2014-06-30
  • 2020-04-14
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 2020-02-05
  • 1970-01-01
相关资源
最近更新 更多