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_string
和array
如下:
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
我有一个在 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_string
和array
如下:
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