java - JOOQ 中的 CASE 表达式

标签 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”)都是 boolean 值。

我查看了其他相关问题和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 语句。

最佳答案

您可能会使用 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();

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

关于java - JOOQ 中的 CASE 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53606041/

相关文章:

java - Apache http 客户端 : connection timeout for "no route to host" case

java - Android:从 sampledata 文件夹中读取 json

mysql - 我们如何将属于两个不同表的具有不同名称的两列合并为一个列

sql - 在执行 Select 查询时,如何忽略 Postgresql 中列具有特定值的数据行?

kotlin - 无法解析androidx上的引用Recyclerview.adapter

css - 如何将节点样式(或 styleClass)绑定(bind)到属性?

java - SVN 产品开发——这个过程有多好?

java - 如何提高大型文本文件的数据加载性能

Java StreamCorruptedException 试图反序列化从 SharedPreferences Android 读取的对象

sql - 在sqlite3中使用row_number时出现语法错误