我有一个结果集,它返回一个(重复的)名称列表,其中包含与该名称相关的一些sql条件。它是一个2列结果集。它看起来像这样:
____________________________________
|id | data |
|__________________________________|
|john | sql1 |
|john | sql2 |
|adam | sql1 |
|jack | sql3 |
|jack | sql2 |
____________________________________
我想要的是构建一个如下所示的SQL查询:
select *, 'john' as id from table_x where sql1 or sql2
union
select *, 'adam' as id table_x where sql1
union
select *, 'jack' as id from table_x where sql3 or sql2;
这可以简单地通过在while循环中使用res.next()并在那里做一些魔术吗?我想过使用二维数组或一个Map来首先存储结果集,然后迭代它以完成这个,但是想知道是否有更好/更简单的方法来做到这一点。
答案 0 :(得分:2)
是的,这是可能的。
如果按Model1.object.create(**name)
Model2.object.create(**name)
Model3.object.create(**name)
对查询进行排序,则可以使用正常的id
循环,并检查ResultSet
值的更改。不需要2D数组或id
,只需Map
来逐步构建有问题的SQL。
StringBuilder
答案 1 :(得分:2)
看来impala有一个group_concat函数,所以你可以利用它来消除一个步骤。
(table_y是您的初始结果集来自的表
select id, group_concat(data) as predicates from table_y group by id;
然后简单地遍历它们:
String sql;
while(rs.next()) {
String rPredicates = rs.getString("predicates").split(",");
sql = "SELECT *, " + rs.getString("id") + " FROM table_x WHERE "
sql += rPredicates[0];
for(int ndx=1; ndx< rPredicates.length; ndx++) {
sql += " or " + rPredicates[ndx];
}
sql += " union ";
}
这是未经测试的,但你明白了。您可以使用StringUtils.join或.collapse类似的东西消除几行。那里有很多字符串工具类。
如果你足够努力,你可能只能用SQL生成它,但这至少要好一些。
修改强> 我要一个,你可以为group_concat提供一个分隔符,所以你可以执行这个SQL来启动
select id, group_concat(date, ' or ') as predicates from table_y;
然后你不必组装谓词,只需附加整个谓词。
答案 2 :(得分:1)
您将收到一个结果集,该结果集是所有3个选择的并集。如果要按id列进行分类,则只需遍历结果集,并根据id列的值处理当前行(例如,将id值用作映射中的键)。