我将jOOQ与PostgreSQL结合使用,并试图使用CASE WHEN创建一个具有多个计数的select查询。因为只计算唯一的记录很重要,所以我也使用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来实现这一点,那就太好了。
发布于 2019-07-15 15:21:19
SQL工作的原因是因为("CategoryID", "PageID")被解释为元组,Postgres可以清楚地计算这些数据。否则,count(distinct)不接受多个表达式。
我不知道如何在JOOQ中创建元组。但是,您可能可以进行一些字符串连接以获得"CategoryID" || ':' || "PageID"并获得所需的结果。
https://stackoverflow.com/questions/57042703
复制相似问题