H2数据库:从子查询中获取行作为数组

H2 Database: Get rows from subquery as array

我有一个在 PostgreSQL 上运行良好的查询,我需要在 H2Database 上使用它。

对表格重要的基本上只是一个 id integer 字段。

PostgreSQL 上的查询示例及其结果如下:

select id, 
array_to_string(
    array(select id from table1)
,',') 
from table2
order by id

结果:

id | array_to_string
2  | 1,3,4,5,2
3  | 1,3,4,5,2
4  | 1,3,4,5,2
6  | 1,3,4,5,2
7  | 1,3,4,5,2
8  | 1,3,4,5,2
9  | 1,3,4,5,2
10 | 1,3,4,5,2

对于H2,我实现了用户自定义函数array_to_stringarray如下:

public class H2Functions {

    public static String arrayToString(final Object[] array, final String separator) {
        return StringUtils.join(array, separator);
    }

    public static Object array(final Object row) {
        return "???";
    }

}

问题是我无法实施 array,因为我不知道它通过了什么。

查询失败:

Scalar subquery contains more than one row;

我怎样才能说服 H2 return 一些 array 可以使用的东西?

您并不是真的希望将行作为数组,而是希望它们作为逗号分隔的列表。 array_to_string( array(select id from table1),',') 在 Postgres 中一开始就不必要地复杂化。可以简化为

select id, 
       (select string_agg(id::text, ',') from table1) as id_list
from table2
order by id

这表明您可以简单地使用 H2 的 group_concat(),它等同于 Postgres 的 string_agg():

select id, 
       (select group_concat(id separator ',') from table1) as id_list
from table2
order by id

自 1.4.197 H2 vervion 也将值聚合成一个数组函数 ARRAY_AGG 可用。
参见 https://www.h2database.com/html/functions-aggregate.html#array_agg