在案例查询中显式转换枚举

Posted

技术标签:

【中文标题】在案例查询中显式转换枚举【英文标题】:Explicitly casting enum in case query 【发布时间】:2021-08-26 06:29:40 【问题描述】:

我正在使用 jOOQ 构建 Postgres 查询(不过,查询不会使用 jOOQ 发送到数据库,它用于创建 vertx 使用的查询)。

查询包含一个带有“案例”的片段:

...
set "state" = case
    when "theschema"."actions"."is_promoted" = true then 'OK'
    else "theschema"."actions"."state"
end

查询失败

ERROR: "CASE types actions_state_enum and text cannot be matched"

解决方案是将 'OK' 转换为 actions_state_enum,类似于 'OK'::"theschema"."actions_state_enum"。

上面创建查询片段的代码如下所示:

DSL.iif(ACTIONS.IS_PROMOTED.isTrue(), ActionsStateEnum.OK, ACTIONS.STATE)

我找不到在代码中添加所需转换的方法。尝试使用 DSL.inline 添加自定义绑定但没有运气。

【问题讨论】:

ActionsStateEnum 是什么?手写的、自定义的枚举,还是代码生成器生成的枚举类型? @LukasEder 这是 jooq 生成的枚举。实际上,我认为我找到了它不起作用的原因:dsl 上下文使用的是 static_statement 类型,使用prepared_statement 时,铸造是开箱即用的。 【参考方案1】:

这看起来像https://github.com/jOOQ/jOOQ/issues/5612。将尽快解决此问题。解决方法是使用显式生成强制转换的自定义数据类型绑定

【讨论】:

以上是关于在案例查询中显式转换枚举的主要内容,如果未能解决你的问题,请参考以下文章

是否执行了视图列集中的所有函数,即使它们没有在查询中显式引用?

SQL中显式Join Transitive Closure的优点是啥?

sequelize抛出错误方言需要在express js中显式定义

在 XML 查询中显式定义数据类型,以便 s-s-rS 从 WCF 服务中识别

在 terraform 模块中显式使用提供程序

在 DataFrameMapper 中显式删除列