我正在尝试在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))
答案 0 :(得分:1)
你似乎在寻找的是SQL:2003简单CASE
表达式,它允许形成像&#34;部分谓词&#34;基于案例值,类似于其他语言中的模式匹配。 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.*;