postgresql 中的 jOOQ 聚合函数
jOOQ aggregation functions in postgresql
PostgreSQL 9.4.5
jOOQ 3.7.2
方言设置为 POSTGRES_9_4
我正在尝试使用 jOOQ 来换行替换这个原生的 postgresql 聚合表达式:
array_agg(row_to_json(foo) order by "foo"."name" asc) filter (where "attribute".name is not null)
jOOQ DSL 看起来应该可以使用以下代码工作:
arrayAgg(rowToJson(FOO)).orderBy(FOO.NAME).filterWhere(FOO.NAME.isNotNull()))
其中 rowToJson 是 postgres 函数的包装器。 SQL 呈现的是这样的:
array_agg(row_to_json(foo) order by "foo"."name" asc)
目前我正在解决这个问题:
public static <T> Field<T[]> arrayAgg(Field<T> field, final SortField<?> sort, final Condition filter) {
return field("array_agg({0} order by {1}) filter (where {2})", field.getDataType().getArrayDataType(), field, sort, filter);
}
问题是,第一个代码是否有效?如果不是,在 jOOQ 中生成这个聚合函数的正确方法是什么?
这是 jOOQ (#5158) 中的错误,将在下一个版本中修复。
我能想到两种解决方法:
- 您自己提出的建议:使用普通 SQL 正确地重新实现功能。
通过用 CASE
模拟 FILTER
:
arrayRemove(
arrayAgg(when(FOO.NAME.isNotNull(), rowToJson(FOO))).orderBy(FOO.NAME))
, null
)
PostgreSQL 9.4.5 jOOQ 3.7.2 方言设置为 POSTGRES_9_4
我正在尝试使用 jOOQ 来换行替换这个原生的 postgresql 聚合表达式:
array_agg(row_to_json(foo) order by "foo"."name" asc) filter (where "attribute".name is not null)
jOOQ DSL 看起来应该可以使用以下代码工作:
arrayAgg(rowToJson(FOO)).orderBy(FOO.NAME).filterWhere(FOO.NAME.isNotNull()))
其中 rowToJson 是 postgres 函数的包装器。 SQL 呈现的是这样的:
array_agg(row_to_json(foo) order by "foo"."name" asc)
目前我正在解决这个问题:
public static <T> Field<T[]> arrayAgg(Field<T> field, final SortField<?> sort, final Condition filter) {
return field("array_agg({0} order by {1}) filter (where {2})", field.getDataType().getArrayDataType(), field, sort, filter);
}
问题是,第一个代码是否有效?如果不是,在 jOOQ 中生成这个聚合函数的正确方法是什么?
这是 jOOQ (#5158) 中的错误,将在下一个版本中修复。
我能想到两种解决方法:
- 您自己提出的建议:使用普通 SQL 正确地重新实现功能。
通过用
CASE
模拟FILTER
:arrayRemove( arrayAgg(when(FOO.NAME.isNotNull(), rowToJson(FOO))).orderBy(FOO.NAME)) , null )