如何Jooq明确或countdistctct多列

时间:2012-08-23 07:33:52

标签: java mysql distinct aggregate-functions jooq

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

public static AggregateFunction<Integer> countDistinct(Field<?> field);

并且没有像distinct(Field... fields)

这样的功能

我想表达一个这样的SQL语句:

select c1, count(distinct c2,c3) from t1 group by c1;

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

1 个答案:

答案 0 :(得分:3)

这很有趣。据我所知,这在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>

无论有没有DISTINCT设置量词,都没有逗号分隔的参数列表的空间。这在Oracle中正确实现:

enter image description here

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

COUNT(DISTINCT expr,[expr...])
     

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

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

要回答您的问题,目前在jOOQ中无法做到这一点,尽管我已提交#1728以供将来支持。目前,您可以通过编写自己的多参数聚合函数支持来解决此问题:

Field<Integer> myCount = Factory.field(
  "count(distinct {0}, {1})", Integer.class, c2, c3);

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

现在在jOOQ 2.6中实现:

你可以写

Field<Integer> count = Factory.countDistinct(c2, c3);

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