JOOQ 中的 CASE 表达式
CASE Expression in 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 并且可以使以下 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 中使用 'or' 的早期 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();
请注意,我正在使用 DSL.condition(Field<Boolean>)
将 Field<Boolean>
变成 Condition
,这可能是您正在寻找的 API
如何在 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 中使用 'or' 的早期 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();
请注意,我正在使用 DSL.condition(Field<Boolean>)
将 Field<Boolean>
变成 Condition
,这可能是您正在寻找的 API