对JDBC ResultSet的自定义迭代

时间:2015-12-18 18:51:39

标签: java loops jdbc resultset impala

我有一个结果集,它返回一个(重复的)名称列表,其中包含与该名称相关的一些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来首先存储结果集,然后迭代它以完成这个,但是想知道是否有更好/更简单的方法来做到这一点。

3 个答案:

答案 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值用作映射中的键)。