1

Factoryクラスの個別の関数は1つのパラメーターのみを受け入れることがわかりました

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)がありますが、それはすべての列を「区別」します。これは私が望むものではありません。

4

1 に答える 1

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>

DISTINCTset 量指定子の有無にかかわらず、コンマ区切りの引数リストを入れる余地はありません。これは Oracle で正しく実装されています。

ここに画像の説明を入力

それでも、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);

Factory.countDistinct(Field...)詳細については、メソッドの Javadoc を参照してください。

于 2012-08-23T08:02:11.973 に答える