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

ygl*_*odt 2 java sql arrays h2

我有一个可以在 PostgreSQL 上正常运行的查询,并且我需要在 H2Database 上使用它。

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

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

select id, 
array_to_string(
    array(select id from table1)
,',') 
from table2
order by id
Run Code Online (Sandbox Code Playgroud)

结果:

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
Run Code Online (Sandbox Code Playgroud)

对于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 "???";
    }

}
Run Code Online (Sandbox Code Playgroud)

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

查询失败并显示:

Scalar subquery contains more than one row;
Run Code Online (Sandbox Code Playgroud)

我如何说服 H2 返回array可以使用的东西?

小智 6

您实际上并不希望这些行作为数组,您希望它们作为逗号分隔的列表。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
Run Code Online (Sandbox Code Playgroud)

这清楚地表明您可以简单地使用 H2,group_concat()它相当于 Postgres string_agg()

select id, 
       (select group_concat(id separator ',') from table1) as id_list
from table2
order by id
Run Code Online (Sandbox Code Playgroud)