jooq中的Case When语法表达式

Posted

技术标签:

【中文标题】jooq中的Case When语法表达式【英文标题】:Case When syntax expression in jooq 【发布时间】:2018-04-04 23:06:12 【问题描述】:

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

select case     
when year(d.date) - p.birth_year < 5 then '<5' 
else '5+'
end as age
from partners p join departure d on d.id = p.id

this.schema().select(
DSL.decode().value(dateDiff(p.BIRTHDATE , date(d.DATE)))
   .when(greaterThan(5), "above 5")
   .when(lessThan(5), "under 5")
   .otherwise("unknown").as("age"),
   .from(p)
   .join(d).on(d.ID.eq(p.ID))

【问题讨论】:

【参考方案1】:

您似乎正在寻找的是 SQL:2003 简单的CASE 表达式,它允许基于大小写值形成“部分谓词”之类的东西,类似于其他语言中的模式匹配。 jOOQ 尚不支持此功能,请参阅 Issue #3223。

不过,有趣的是,您的 SQL 示例没有使用这种语法,也不符合您建议的 jOOQ API 用法。我怀疑您想使用这种语法来避免重复两次减法。这也可以在 SQL 中按如下方式完成:

select 
  case sign(year(d.date) - p.birth_year - 5)
  when -1 then '<5'
  when  0 then '5+'
  when  1 then '5+'
          else 'unknown' end AS age
from partners p join departure d on d.id = p.id

这将转化为:

Partners p = PARTNERS.as("p");
Departure d = DEPARTURE.as("d");

using(configuration)
   .select(choose(sign(year(d.DATE).minus(p.BIRTH_YEAR).minus(5)))
       .when(inline(-1), val("<5"))
       .when(inline( 0), val("5+"))
       .when(inline( 1), val("5+"))
       .otherwise(inline("unknown"))
       .as("age"))
   .from(p)
   .join(d).on(d.ID.eq(p.ID))
   .fetch();

这个静态导入是隐含的:

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

【讨论】:

正是我正在寻找的东西,尤其是inline(-1) 符号。感谢您提供清晰而详尽的解决方案。 +10 提供static import 很多解决方案离开了那部分 @joseph:谢谢你的好话。是的,DSL.inline() 经常被忽视。以下是有关它的更多详细信息:jooq.org/doc/latest/manual/sql-building/bind-values/…

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

SQL中的decode及case when的用法

select case when if 的一些用法

oracle中的case when then else end 用法

云计算学习路线图素材课件,msyql中CASE WHEN语法

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

MySQL 的CASE WHEN 语句