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_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 "???";
}
}
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)