【问题标题】:Jooq query issue with case案例的 Jooq 查询问题
【发布时间】:2014-03-09 20:49:34
【问题描述】:

我写了这个 mysql 查询并尝试将其转换为 JOOQ 查询但没有成功,这是 mysql 查询

SELECT `P`.`phone_number`, `A`.`emp_no`,   
SUM(CASE WHEN VCG.vid IN (
SELECT gv.vid FROM `grvas` gv JOIN gprs gr ON gr.id=gv.grid 
WHERE gr.id=G.id AND gv.stdate < '2011-08-15'  AND gv.enddate > '2011-09-14') 
THEN VCG.amount END) AS allow,
... etc...

如何将此查询转换为 JOOQ 查询?
谢谢,

【问题讨论】:

  • 当你尝试时,你走了多远?
  • f.select(P.PHONE_NUMBER,A.EMP_NO, sum(when()) ....etc => 但我不能使用 sum 或这样的时候
  • 在这种情况下我不能使用这里提到的技术 (jooq.org/manual/DSL/CASE)

标签: java mysql jooq


【解决方案1】:

这个:

SUM(
  CASE 
  WHEN VCG.vid IN (
    SELECT gv.vid 
    FROM `grvas` gv 
      JOIN gprs gr ON gr.id=gv.grid 
    WHERE gr.id=G.id 
      AND gv.stdate < '2011-08-15'  
      AND gv.enddate > '2011-09-14'
  ) 
  THEN VCG.amount 
  END
) AS allow

会翻译成这样的:

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

// And then
sum(
  decode()
  .when(VCG.VID.in(
      select(GRVAS.VID)
      .from(GRVAS)
        .join(GPRS).on(GPRS.ID.eq(GRVAS.GRID))
      .where(GPRS.ID.eq(G.ID))
      .and(GRVAS.STDATE.lt(Date.valueOf("2011-08-15")))
      .and(GRVAS.ENDDATE.gt(Date.valueOf("2011-09-14")))
  )), VCG.AMOUNT)
).as("allow")

上面的例子在IN谓词的子查询中省略了表别名,以简化事情。当然,您也可以继续为所有这些表设置别名。

【讨论】:

    【解决方案2】:

    我找不到将上述 sql 转换为 JOOQ 的正确方法,但我使用了

    String sql="SELECT `P`.`phone_number`, `A`.`emp_no`,   
                 SUM(CASE WHEN VCG.vid IN (
                 SELECT gv.vid FROM `grvas` gv JOIN gprs gr ON gr.id=gv.grid 
                 WHERE gr.id=G.id AND gv.stdate < '2011-08-15'  AND gv.enddate > '2011-09-14') 
                 THEN VCG.amount END) AS allow,
                 ... etc... " ;
    Result<Record> res = f.fetch(sql);  
    

    这个工作正常 谢谢

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-24
      • 2017-04-06
      • 1970-01-01
      • 2014-11-27
      • 2011-09-28
      • 2019-11-21
      • 2016-03-08
      • 2018-07-03
      相关资源
      最近更新 更多