Как использовать SUM внутри COALESCE в JOOQ

#java #jooq #mysql-5.6

#java #jooq #mysql-5.6

Вопрос:

Ниже приведена суть запроса, который я могу успешно выполнить MySQL

 SELECT a.*, 
COALESCE(SUM(condition1 or condition2), 0) as countColumn
FROM table a 
-- left joins with multiple tables
GROUP BY a.id;
  

Теперь я пытаюсь использовать его с JOOQ.

 ctx.select(a.asterisk(),                
            coalesce(sum("How to get this ?")).as("columnCount"))
            .from(a)
            .leftJoin(b).on(someCondition)
            .leftJoin(c).on(someCondition))
            .leftJoin(d).on(someCondition)
            .leftJoin(e).on(someCondition)
            .groupBy(a.ID);     
  

Мне трудно подготовить coalesce() часть, и я был бы очень признателен за помощь.

Комментарии:

1. Привет @roshan, я тоже сталкиваюсь с той же проблемой. Не могли бы вы сообщить мне, как вы использовали coalesce с sum в JOOQ.

Ответ №1:

API jOOQ более строг в отношении различия между Condition и Field<Boolean> , что означает, что вы не можете просто обрабатывать логические значения как числа, как вы можете в MySQL. Обычно неплохо четко указывать типы данных, чтобы предотвратить крайние случаи, поэтому такая строгость не обязательно плохая.

Итак, вы можете преобразовать свои логические значения в целые числа следующим образом:

 coalesce(
  sum(
    when(condition1.or(condition2), inline(1))
    .else_(inline(0))
  ), 
  inline(0)
)
  

Но даже лучше, почему бы не использовать стандартное предложение SQL FILTER , которое можно эмулировать в MySQL с помощью COUNT(CASE ...) агрегатной функции:

 count().filterWhere(condition1.or(condition2))
  

Комментарии:

1. Большое вам спасибо @Lukas, оказывается FILTER , это именно то, что я искал.