JOOQ中的CASE表达式

时间:2018-12-04 05:09:50

标签: java sql kotlin dsl jooq

如何在JOOQ中编写以下SQL?

SELECT COUNT(*) as total, 
       SUM(CASE WHEN (in_kind OR goods) THEN 1 ELSE 0 END) AS alt_donation
FROM donation

所有三列(“ not_found”,“ in_kind”和“ goods”)均为布尔值。

我研究了其他相关问题和JOOQ CASE Documentation,并且可以在JOOQ中使以下sql正常工作。

SELECT COUNT(*) AS total, 
       SUM(CASE WHEN (not_found) THEN 0 ELSE 1 END) AS alt_donation
FROM donation

对于此示例,JOOQ版本正确运行:

val query = dslContext
    .select(DSL.count().`as`("donations"),
            DSL.sum(DSL.choose(DONATION.NOT_FOUND).`when`(true, 0).otherwise(1)).`as`("altdonation"))
    .from(DONATION)

我需要使用在CASE中使用“或”的早期sql语句。

1 个答案:

答案 0 :(得分:2)

您可能会使用FILTER (WHERE ..) clause,它与jOOQ一样,并以与您本机不支持的SQL方言类似的方式仿真:

在SQL中

SELECT COUNT(*) as total, 
       COUNT(*) FILTER (WHERE in_kind OR goods) AS alt_donation
FROM donation

在jOOQ

ctx.select(count().`as`("donations"),
           count().filterWhere(condition(DONATION.IN_KIND)
                           .or(condition(DONATION.GOODS))).`as`("alt_donation"))
   .from(DONATION)
   .fetch();

注意,我正在使用DSL.condition(Field<Boolean>)Field<Boolean>变成Condition,这可能是您正在寻找的API