我想在表的一列中创建值的直方图,并且我已经知道该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中这是最好的方法吗?有这么多......
答案 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 ...