【问题标题】:Case When syntax expression in jooqjooq中的Case When语法表达式
【发布时间】: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))

【问题讨论】:

    标签: java sql jooq


    【解决方案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/…
    猜你喜欢
    • 2021-12-08
    • 2019-05-05
    • 2021-03-26
    • 2018-02-01
    • 2012-09-20
    • 2022-08-03
    • 2014-04-27
    • 2021-08-30
    • 2014-09-17
    相关资源
    最近更新 更多