Jooq distinct 或 countDistinct 多于一列

gen*_*chu 1 java mysql distinct aggregate-functions jooq

我发现Factory类中的distinct函数只接受一个参数

public static AggregateFunction<Integer> countDistinct(Field<?> field);
Run Code Online (Sandbox Code Playgroud)

并且没有类似的功能 distinct(Field... fields)

我想表达这样的 SQL 语句:

select c1, count(distinct c2,c3) from t1 group by c1;
Run Code Online (Sandbox Code Playgroud)

PS:有一个非 dsl api: SelectQuery.setDistinct(true),但它会“区分”所有列,这不是我想要的。

Luk*_*der 5

这太有趣了。据我所知,这在 SQL 中是不可能的。SQL:2008 标准规定

10.9 <aggregate function>

Format
<aggregate function> ::=
      COUNT <left paren> <asterisk> <right paren> [ <filter clause> ]
    | <general set function> [ <filter clause> ]

<general set function> ::=
  <set function type> <left paren> [ <set quantifier> ]
    <value expression> <right paren>
Run Code Online (Sandbox Code Playgroud)

逗号分隔的参数列表没有空间,有或没有DISTINCTset 量词。这在 Oracle 中正确实现:

在此处输入图片说明

然而,MySQL 似乎允许这种非标准的“方便语法”:

COUNT(DISTINCT expr,[expr...])
Run Code Online (Sandbox Code Playgroud)

返回具有不同非 NULL expr 值的行数。

(取自http://dev.mysql.com/doc/refman/5.6/en/group-by-functions.html#function_count)。

为了回答您的问题,目前在 jOOQ 中这是不可能的,尽管我提交了#1728以供将来支持。目前,您可以通过编写自己的多参数聚合函数支持来解决此问题:

COUNT(DISTINCT expr,[expr...])
Run Code Online (Sandbox Code Playgroud)

请参阅相关的Javadoc文档的Factory.field(String, Class<T>, QueryPart...)详细信息的方法

这现在在 jOOQ 2.6 中实现:

你可以写

Field<Integer> count = Factory.countDistinct(c2, c3);
Run Code Online (Sandbox Code Playgroud)

有关该Factory.countDistinct(Field...)方法的详细信息,请参阅 Javadoc