首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >jOOQ -从“然后”中的“时间”查询返回字段的元组

jOOQ -从“然后”中的“时间”查询返回字段的元组
EN

Stack Overflow用户
提问于 2019-07-15 15:16:02
回答 2查看 541关注 0票数 2

我将jOOQ与PostgreSQL结合使用,并试图使用CASE WHEN创建一个具有多个计数的select查询。因为只计算唯一的记录很重要,所以我也使用DISTINCT语句。有时,我需要区分多个列,这在SQL语法上是完全正确的,但我不知道如何在jOOQ中做到这一点。

我使用CASE进行计数,因为我还有更多条件的查询。为了方便起见,我简化了这些示例。

使用SQL的示例:

代码语言:javascript
复制
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

当我只尝试一个字段时,它就起作用了:

代码语言:javascript
复制
query.addSelect(
    DSL.countDistinct(
        DSL.when(DSL.condition(Operator.AND, conditions), CATEGORY_ID)
    ).as("UserCatNum")
);

但当我尝试这样的东西时:

代码语言:javascript
复制
query.addSelect(
    DSL.countDistinct(
        DSL.when(DSL.condition(Operator.AND, conditions),
        DSL.row(CATEGORY_ID, PAGE_ID))
    ).as("UserPageNum")
);

我得到了以下错误:

代码语言:javascript
复制
Cannot interpret argument of type class org.jooq.impl.RowImpl as a Field: ("data_table"."CategoryID", "data_table"."PageID")

我尝试了DSL.row(),因为我看到了与IN语句类似的用法。我也尝试用DSL.select()替换它,但是它不起作用,数组和列表都不起作用。

现在,我通过编写一个小函数来解决这个问题:

代码语言:javascript
复制
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来实现这一点,那就太好了。

EN

Stack Overflow用户

发布于 2019-07-15 15:21:19

SQL工作的原因是因为("CategoryID", "PageID")被解释为元组,Postgres可以清楚地计算这些数据。否则,count(distinct)不接受多个表达式。

我不知道如何在JOOQ中创建元组。但是,您可能可以进行一些字符串连接以获得"CategoryID" || ':' || "PageID"并获得所需的结果。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57042703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档