【问题标题】:CASE Expression in JOOQJOOQ 中的 CASE 表达式
【发布时间】:2019-05-05 11:20:17
【问题描述】:

如何在 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,可以使以下sql在JOOQ中工作。

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 语句。

【问题讨论】:

    标签: java sql kotlin dsl jooq


    【解决方案1】:

    您可能可以使用 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

    【讨论】:

    • 谢谢,它成功了。另外,感谢您的 SQL 更正。使用 FILTER 比使用 CASE 干净得多。
    猜你喜欢
    • 2018-04-04
    • 2014-04-27
    • 2021-12-08
    • 1970-01-01
    • 2020-07-03
    • 2017-05-30
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    相关资源
    最近更新 更多