【发布时间】:2019-11-24 07:56:33
【问题描述】:
我将 jOOQ 与 PostgreSQL 一起使用,并尝试使用 CASE WHEN 创建具有多个计数的选择查询。因为只计算唯一记录很重要,所以我也使用DISTINCT 语句。有时我需要区分多个列,这在 SQL 语法中是完全正确的,但我不知道如何在 jOOQ 中做到这一点。
我使用CASE 进行计数,因为我还有更多条件的查询。为了方便起见,我简化了这些示例。
工作 SQL 示例:
select
count(distinct (case when "UserID" = 11 then "CategoryID" end)) as "UserCatNum",
count(distinct (case when "UserID" = 11 then ("CategoryID", "PageID") end)) as "UserPageNum"
from data_table
当我尝试只使用一个字段时,它可以工作:
query.addSelect(
DSL.countDistinct(
DSL.when(DSL.condition(Operator.AND, conditions), CATEGORY_ID)
).as("UserCatNum")
);
但是当我尝试这样的事情时:
query.addSelect(
DSL.countDistinct(
DSL.when(DSL.condition(Operator.AND, conditions),
DSL.row(CATEGORY_ID, PAGE_ID))
).as("UserPageNum")
);
我收到以下错误:
Cannot interpret argument of type class org.jooq.impl.RowImpl as a Field: ("data_table"."CategoryID", "data_table"."PageID")
我尝试了DSL.row(),因为我看到IN 语句的类似用法。我也尝试用DSL.select() 替换它,但它不起作用,数组和列表都不起作用。
现在我通过编写一个小函数解决了这个问题:
private Field<Object> tupleField(Field... fields) {
String tuple = Arrays.stream(fields)
.map(f -> f.getQualifiedName().quotedName().toString())
.collect(Collectors.joining(","));
return DSL.field("(" + tuple + ")");
}
但如果知道如何使用 jOOQ 的 API 来做到这一点,那就太好了。
【问题讨论】:
标签: java sql postgresql jooq