情况何时在jooq中使用语法表达式

时间:2017-10-24 08:29:07

标签: java sql jooq

我正在尝试在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 个答案:

答案 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.*;