CASE Выражение в JOOQ - PullRequest
       21

CASE Выражение в JOOQ

0 голосов
/ 04 декабря 2018

Как мне написать следующий SQL в JOOQ?

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 и может заставить следующий 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)

Мне нужно использовать более ранний SQL-оператор, который использует 'или' в CASE.

1 Ответ

0 голосов
/ 04 декабря 2018

Возможно, вы могли бы использовать предложение FILTER (WHERE ..) , которое поддерживается 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, который вы искали

...