2016-01-20 54 views
1

我有一個可以在PostgreSQL中正常工作的查詢,我需要在H2Database上使用它。H2數據庫:從子查詢中獲取行作爲數組

重要的表格基本上只有一個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 "???"; 
    } 

} 

問題是我無法實現因爲我不知道它通過了什麼。

查詢失敗:

Scalar subquery contains more than one row; 

我怎樣才能說服H2返回一些東西,array可以工作?

+0

無關,而是:檢索*** ***所有來自'table1'的'id2'的_each_行的id對我來說似乎很奇怪。你確定你不需要共同相關的子查詢嗎?或者甚至是在這些表之間進行正確的連接和「分組」操作? –

+0

該查詢只是一個示例查詢,在我的應用程序中有子句。 – yglodt

回答

2

你不是真的想把這些行作爲一個數組,你希望他們作爲逗號分隔的列表。在Postgres中,array_to_string(array(select id from table1),',')是不必要的複雜。它可以簡化爲

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 
+0

謝謝,完美的作品。並再次感謝PostgreSQL的優化提示。 – yglodt