ОТЛИЧИТЬСЯ () в JOOQ

2

Я хотел бы сделать запрос в PostgreSQL

select 
  distinct on(uuid) 
  (select nr_zew from bo_get_sip_cti_polaczenie_info(uuid)) as nr_zew 
from bo_sip_cti_event_day
where data_ins::date = current_date
and kierunek like 'P'
and (hangup_cause like 'NO_ANSWER' or hangup_cause like 'NO_USER_RESPONSE') 

на Java, насколько я могу

Result<Record> result = create
    .select()
    .from("bo_sip_cti_event_day")
    .where("data_ins::date = current_date")
    .and("kierunek like 'P'")
    .and("(hangup_cause like 'NO_ANSWER' or hangup_cause like 'NO_USER_RESPONSE') ")
    .fetch();

и он работает, но когда я пытаюсь добавить

Result<Record> result = create
    .selectDistinct("uuid")
    .from("bo_sip_cti_event_day")
    .where("data_ins::date = current_date")
    .and("kierunek like 'P'")
    .and("(hangup_cause like 'NO_ANSWER' or hangup_cause like 'NO_USER_RESPONSE') ")
    .fetch();

то он говорит, что не может сделать selectDistinct(String). Как я могу использовать различные jOOQ?

  • 0
    Этот открытый вопрос, вероятно, означает, что JOOQ в настоящее время не поддерживает distinct on версии: github.com/jOOQ/jOOQ/issues/3564
  • 0
    Так что я должен использовать GROUP BY ()?
Теги:
jooq

1 ответ

3
Лучший ответ

Это определенно неочевидно. После выбора фактических столбцов существует метод SelectDistinctOnStep.distinctOn(). Причина, по которой это неочевидно обнаружить, заключается в том, что сам синтаксис PostgreSQL немного сложно моделировать во внутреннем DSL, таком как jOOQ.

Подумайте об этом так: вы выбираете набор столбцов (коррелированный подзапрос), указывая, на каких столбцах должен применяться фильтр четкости:

Result<Record> result = create
  .select(field("(select nr_zew from bo_get_sip_cti_polaczenie_info(uuid))").as("nr_zew"))
  .distinctOn(field("uuid"))
  .from("bo_sip_cti_event_day")
  .where("data_ins::date = current_date")
  .and("kierunek like 'P'")
  .and("(hangup_cause like 'NO_ANSWER' or hangup_cause like 'NO_USER_RESPONSE') ")
  .fetch();

Или, если вы используете генератор кода:

Result<Record> result = create
  .select(field(
     select(BO_GET_SIP_CTI_POLACZENIE_INFO.NR_ZEW)
    .from(BO_GET_SIP_CTI_POLACZENIE_INFO.call(BO_SIP_CTI_EVENT_DAY.UUID))).as("nr_zew"))
  .distinctOn(BO_SIP_CTI_EVENT_DAY.UUID)
  .from(BO_SIP_CTI_EVENT_DAY)
  .where(BO_SIP_CTI_EVENT_DAY.cast(Date.class).eq(currentDate()))
  .and(BO_SIP_CTI_EVENT_DAY.KIERUNEK.like("P"))
  .and(BO_SIP_CTI_EVENT_DAY.HANGUP_CAUSE.like("NO_ANSWER")
    .or(BO_SIP_CTI_EVENT_DAY.HANGUP_CAUSE.like("NO_USER_RESPONSE")))
  .fetch();

Замечание по использованию LIKE

Обратите внимание, что символ подчеркивания (_) является односимвольной wild-картой в SQL, поэтому ваши предикаты LIKE могут быть не совсем корректными. В идеале просто используйте обычные предикаты сравнения, такие как:

  • kierunek = 'P'
  • hangup_cause IN ('NO_ANSWER', 'NO_USER_RESPONSE')

Вы на самом деле не кажется, нужно LIKE.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню