jooq中的Case When或iif语法表达式

Posted

技术标签:

【中文标题】jooq中的Case When或iif语法表达式【英文标题】:Case When or iif syntax expression in jooq 【发布时间】:2021-12-08 21:03:37 【问题描述】:

我正在尝试在 jooq 中重现这个 mysql 查询。

messageTable1、messageTable2 同列

select 
msg.index as index,
left(msg.message, if(msg.type = 1, 10, msg.maxLength)) as message
from
messageTable1 as msg

select 
msg.index as index,
left(msg.message, if(msg.type = 1, 10, msg.maxLength)) as message
from
messageTable2 as msg

制作函数java

public Message getMessageTest(String tableName) 
    return roDslContext.select(
           DSL.field("msg.index").as("index"),
           left(DSL.field( "0", String.class, "msg.message"), 
              when(DSL.field("msg.type").eq(1), 10, DSL.field( "0", String.class, "msg.maxLength").as("message)
           .from(tableName)
           .fetchOneInto(Message.class);

但是....

when(DSL.field("msg.type").eq(1), 10, DSL.field( "0", String.class, "msg.maxLength").as("message)

jooq 是字段 msg.maxLength ... 不接受

也是如此

如何,何时,iif插入字段列数据??

【问题讨论】:

tableName -> "messageTable1" 或 "messageTable2" 【参考方案1】:

使用code generator

我假设您在此示例中没有使用代码生成器,因为您希望根据表名使列引用动态化。

有可能在您的表上生成通用接口,这将对两种表类型进行抽象。此外,在这些表上生成了Table.rename(String) 方法,这些方法允许重命名表MESSAGE_TABLE_1.rename("message_table_2")。所以您的查询将如下所示:

public Message getMessageTest(String tableName) 
    MessageTable1 msg = MESSAGE_TABLE_1.rename(tableName);

    return roDslContext
        .select(
            msg.INDEX,
            left(msg.MESSAGE, if_(msg.TYPE.eq(1), val(10), msg.MAX_LENGTH))
        )
        .from(msg)
        .fetchOneInto(Message.class);

与往常一样,这是假设以下静态导入:

import static org.jooq.impl.DSL.*;

实际问题

您似乎正在尝试使用plain SQL templating 构造字段引用。你通过DSL.field("msg.index")msg.index 做对了,但不知何故,msg.message 的模板语法被绊倒了。这没有意义:

field("0", String.class, "msg.message");

使用模板时,占位符0 需要替换为QueryPart 实例。您不能只传递 String (这将被解释为绑定值)。您在这里的意思是:

// If you really need templating, though here, you don't:
field("0", String.class, name("msg", "message"));

// Instead, just do this, if you want quoted names:
field(name("msg", "message"), String.class);

// Or this, if you don't care about quoting the name
field("msg.message", String.class);

【讨论】:

我解决了。谢谢卢卡斯。

以上是关于jooq中的Case When或iif语法表达式的主要内容,如果未能解决你的问题,请参考以下文章

楼梯T-SQL:超越基础6级:使用CASE表达式和IIF函数

Mysql:分支结构—case结构

SQL中的decode及case when的用法

select case when if 的一些用法

SQL语句中case,when,then的用法

oracle中的case when then else end 用法