使用jooq创建直方图

时间:2014-01-25 18:27:14

标签: java sql histogram jooq

我想在表的一列中创建值的直方图,并且我已经知道该col的所有可能值

所以,在伪sql中,我想做类似的事情:

select
count(my_col where my_col == "val_1") as "count_for_val_1",
count(my_col where my_col == "val_2") as "count_for_val_2",
etc

一个警告是我想在joog中使用这种查询方式,因为它使条件构造更容易:

SelectQuery query = context.selectQuery();
query.addSelect(...)
query.addFrom(...)
etc

更新:好的,这似乎有效:

SelectQuery query = context.selectQuery();
query.addSelect(my_table.my_col.decode("val_1", "any string here?").count().as("count_for_val_1"));
query.addSelect(my_table.my_col.decode("val_2", "any string here?").count().as("count_for_val_2"));
etc

现在,在JOOQ中这是最好的方法吗?有这么多......

1 个答案:

答案 0 :(得分:0)

您可以使用jOOQ的filterWhere()功能,该功能可用于所有聚合功能。即。

DSL.using(configuration)
   .select(
       count().filterWhere(MY_COL.eq("val_1")).as("count_for_val_1"),
       count().filterWhere(MY_COL.eq("val_2")).as("count_for_val_2"),
       ...
   )
   .from(...)

SQL标准指定AGGREGATE(...) FILTER (WHERE ...)语法,PostgreSQL本身支持该语法:

SELECT
  count(*) FILTER (WHERE my_col = 'val_1') AS "count_for_val_1",
  count(*) FILTER (WHERE my_col = 'val_2') AS "count_for_val_2",
  ...
FROM ...

在所有其他数据库中,jOOQ将生成以下内容

SELECT
  count(CASE WHEN my_col = 'val_1' THEN 1 END) AS "count_for_val_1",
  count(CASE WHEN my_col = 'val_2' THEN 1 END) AS "count_for_val_2",
  ...
FROM ...