gpt4 book ai didi

java - jOOQ - 在 "then"查询中返回 "when"字段的元组

转载 作者:行者123 更新时间:2023-11-29 12:15:25 25 4
gpt4 key购买 nike

我将 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 来执行此操作,那就太好了。

最佳答案

可以使用实验性的 org.jooq.Row2 将行值表达式(例如 org.jooq.Field)转换为普通的列表达式(DSL.rowField())方法。

然后这将在 API 中工作,并可能生成适当的预期 SQL,但从 jOOQ 3.11/3.12 开始,此支持仍处于试验阶段且未经过充分测试。行字段很可能在 CASE 表达式中使用时,无法从数据库中正确提取。

关于java - jOOQ - 在 "then"查询中返回 "when"字段的元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57042703/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com