#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
, это именно то, что я искал.