从结果集中获取不同的用户,并在其他字段上获取字符串concat

时间:2012-03-09 01:50:32

标签: groovy

我有一个查询的Sql ResultSet。它有以下字段:用户名,部门,..责任。 对于deptmt和responsblty,重复的用户名具有不同的值。我想得到一个唯一用户名的地图/列表,其中包含结果集中每个用户的部门和职责列表

所以,如果

       resultset =     (Sam, dept1,.. resp1),
                       (Tom, dept1,..resp3),
                       (Sam,dept2,..resp2),
                       (Tom,dept3,..resp3)...etc

输出应为

 finalList = [["Sam", "dept1,dept2", "resp1,resp2"],["Tom", "dept1,dept3", "resp3"]]

注意事项:
1)可能有n列是变量的(从属性文件中读取列列表),因此代码是可适应的。 _现在不需要,现在是一个固定的清单 2)所有数值用双引号括起并用逗号分隔 3)汤姆责任只包含resp3,因为它重复...即列表中的唯一值。

如何转换结果集?
感谢

2 个答案:

答案 0 :(得分:2)

比尔解决方案的一个较短的替代方案是:

def data = [ ['Sam', 'dept1','resp1'],
            ['Tom', 'dept1','resp3'],
            ['Sam', 'dept2','resp2'],
            ['Tom', 'dept2','resp4'] ]

def output = data.groupBy { it[0] }.collect { name, vals -> 
  $/"$name", "${vals*.getAt( 1 ).join(',')}", "${vals*.getAt( 2 ).join(',')}"/$
}

output.each {
  println it
}

打印哪些:

"Sam", "dept1,dept2", "resp1,resp2"
"Tom", "dept1,dept2", "resp3,resp4"

答案 1 :(得分:1)

这应该让你非常接近。请注意,最终输出中没有引号(Groovy不会为字符串打印)。查看代码,您可以看到“输出”是一个列表集合,每个列表包含3个项目:名称,部门字符串的逗号 - sep列表,然后是责任字符串的逗号 - 列表。

顺便说一句,如果你想创建一个逗号sep列表作为最终输出,你可能想在内部字符串中使用逗号以外的东西。

def data = [ ['Sam', 'dept1','resp1'],
            ['Tom', 'dept1','resp3'],
            ['Sam', 'dept2','resp2'],
            ['Tom', 'dept2','resp4'] ]


def tmpmap = [:]
data.each { inputrow ->
    def name = inputrow[0]
    def curlist = tmpmap[name]
    if ( curlist == null ) { // first time seeing this name
        curlist = [name,inputrow[1],inputrow[2]]
        tmpmap.put( name, curlist );
    } else { // seen this name before
        curlist[1] += ',' + inputrow[1]
        curlist[2] += ',' + inputrow[2]
    }
}
output = tmpmap.values()
println output