Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JDBC结果集上的自定义迭代_Java_Loops_Jdbc_Resultset_Impala - Fatal编程技术网

Java JDBC结果集上的自定义迭代

Java JDBC结果集上的自定义迭代,java,loops,jdbc,resultset,impala,Java,Loops,Jdbc,Resultset,Impala,我有一个resultset,它返回一个(重复的)名称列表,其中包含一些与该名称相关联的sql条件。它是一个2列的结果集。看起来是这样的: ____________________________________ |id | data | |__________________________________| |john | sql1 | |john | sql2

我有一个resultset,它返回一个(重复的)名称列表,其中包含一些与该名称相关联的sql条件。它是一个2列的结果集。看起来是这样的:

____________________________________
|id                |     data      |
|__________________________________|
|john              | sql1          |
|john              | sql2          |
|adam              | sql1          |
|jack              | sql3          |
|jack              | sql2          |
____________________________________
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;
我想构建一个SQL查询,如下所示:

____________________________________
|id                |     data      |
|__________________________________|
|john              | sql1          |
|john              | sql2          |
|adam              | sql1          |
|jack              | sql3          |
|jack              | sql2          |
____________________________________
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()并在那里执行一些魔术,这是可能的吗?我曾想过使用一个二维数组或一个映射来首先存储结果集,然后通过迭代来完成这项工作,但我想知道是否有更好/更简单的方法来完成这项工作

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

是的,这是可能的

如果按
id
对查询进行排序,则可以使用正常的
ResultSet
循环,并检查
id
值的更改。不需要2D数组或
映射
,只需要一个
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);
}

看起来黑斑羚有一个group_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 ";
    }

这样,您就不必组装谓词,只需添加整个内容。

我想您误解了我的问题。我已经有了一个resultset,它是id和数据列。使用它,我想按图所示构建查询。好的,我想我很接近了。您可以构建一个映射,id列值作为键,数据值列表作为值,然后使用这张地图是用来建立每个select@Andreas:关于检查
id
值的变化,你能告诉我正确的方向吗?谢谢!:)转换后的评论回答。你的数据库平台是什么?我假设sql1和sql2是谓词(col_name=value)?@slambeth:你说得对。它们是谓词。我用的是黑斑羚,有没有理由投反对票?谁投了反对票?在两者之间使用StringJoiner可能会很有趣。谢谢你。我会试一试,测试后接受。谢谢!:)这看起来是个好主意!谢谢你的回答:)我会两个都试试,然后挑一个。天哪,蝙蝠侠!那编辑太棒了!我已经有了进行联合的代码(甚至在@Andreas'回答之前)。有了这个查询,我一点也不需要更改代码!想想看,我所需要做的就是RTFM!:P非常感谢!:D@CodingInCircles此解决方案的一个非常重要的信息是DBMS供应商(Impala)。这是一个很好的特定于供应商的解决方案,而我的答案适用于所有DBMS供应商+1表示简单解决方案。是的,这是非常具体的,因此可能不是所有解决方案都需要。不过,其他一些DBMS也有字符串聚合函数。例如,甲骨文就有一个。