MySQL允许我将条件作为参数传递给SUM()。
SELECT COUNT(*), SUM(value > 100) FROM TABLE1;
如this answer所示。
我如何在JOOQ中执行此操作?
答案 0 :(得分:3)
目前(截至jOOQ 3.4),DSL.sum()
函数采用Field<? extends Number>
参数,因此您想要做的事情需要对类型进行一些调整。以下是实现该查询的两种替代方法:
// Static imports are assumed to be present:
import static org.jooq.impl.DSL.*;
DSLContext ctx = using(configuration);
// Solution 1) Coerce Field<Boolean> to Field<Number>
ctx.select(count(), sum(field(TABLE1.VALUE.gt(100)).coerce(Integer.class)))
.from(TABLE1)
.fetch();
// Solution 2) Resort to a raw type cast
ctx.select(count(), sum((Field) field(TABLE1.VALUE.gt(100))))
.from(TABLE1)
.fetch();
在这两种解决方案中,您都需要通过调用org.jooq.Condition
将org.jooq.Field
转换为DSL.field(Condition)
。当使用MySQL本身支持布尔类型的这种用法时,这对生成的SQL没有影响。如果您使用的数据库不支持布尔类型,DSL.field(Condition)
将生成CASE
表达式。
在jOOQ 4.0(Issue #3415)中,DSL.sum()
函数被安排放宽参数类型约束,以便不再调用coerce()
或转换为(Field)
。需要的。