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语法表达式的主要内容,如果未能解决你的问题,请参考以下文章
oracle中的case when then else end 用法