java—jdbc结果集上的自定义迭代

zu0ti5jz  于 2021-06-26  发布在  Impala
关注(0)|答案(3)|浏览(415)

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

2exbekwf

2exbekwf1#

您将收到一个结果集,它是所有3个选择的并集。如果要按id列分类,只需遍历结果集,并基于id列的值处理当前行(例如,使用id value作为Map的键)。

disho6za

disho6za2#

看来 Impala 有一个群concat函数,所以你可以利用它来取消一个步骤。
(表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 simlar删除一些行。有很多string utils类。
如果您足够努力的话,您可能可以完全用sql生成这个,但至少这会更好一些。
编辑:我会把它一起来,你可以提供一个分隔符给组\u concat,这样你就可以执行这个sql来启动

select id, group_concat(date, ' or ') as predicates from table_y;

这样你就不必组装 predicate ,只需附加整个 predicate 。

5hcedyr0

5hcedyr03#

是的,有可能。
如果按 id ,您可以使用普通 ResultSet 循环,并检查 id 价值观。无需二维阵列或 Map ,只是一个 StringBuilder 用于以增量方式构建所讨论的sql。

String prevId = null;
StringBuilder sql = new StringBuilder();
while (rs.next()) {
    String id   = rs.getString("id");
    String data = rs.getString("data");
    if (id.equals(prevId)) {
        sql.append(" or ");
    } else {
        if (prevId != null)
            sql.append(" union ");
        sql.append("select *, '")
           .append(id) // may need to SQL escape value
           .append("' as id from table_x where ");
        prevId = id;
    }
    sql.append(data);
}

相关问题