如何在多行数据库结果中为列标题添加行号后缀以区分行
解决多行查询结果列标题添加行号后缀的问题
我清楚你的需求:第一行的列标题保持原样(比如STD-123),从第二行开始,每个列标题后面加上对应行号后缀(第二行加1,第三行加2,以此类推,比如STD1-222)。
问题分析
你现有代码的核心问题在于行号的计算逻辑出错——rowCount只在default分支里才会递增,这会导致行号无法正确对应每一行结果。另外,行号的判断应该基于当前是第几行查询结果:第一行(索引0)不需要后缀,第二行(索引1)加1,第三行(索引2)加2,以此类推。
修改后的完整代码
下面是调整后的代码,我标注了关键修改点:
import java.io.*; import java.sql.*; public class RetrieveFile { public static void main(String args[]) throws Exception { try { Class.forName("oracle.jdbc.driver.OracleDriver"); Connection con = DriverManager.getConnection("jdbc:oracle:thin:@123.32.23.12:8080/orcl", "test", "******"); // 注意:原SQL仅查询ABS列,根据你的表格示例修正为目标列集合,可按需调整 PreparedStatement ps = con.prepareStatement("select STD, ABC, SSS, AAA from MSG where MID='1123'"); ResultSet rs = ps.executeQuery(); try { printResultColumns(rs); } catch (SQLException e) { System.err.println(e.getMessage()); } con.close(); } catch (Exception e) { e.printStackTrace(); } } public static void printResultColumns(ResultSet resultSet) throws SQLException, IOException { ResultSetMetaData rsmd = resultSet.getMetaData(); int columnCount = rsmd.getColumnCount(); int rowIndex = 0; // 用rowIndex记录当前行索引,从0开始计数 while (resultSet.next()) { StringBuilder rowOutput = new StringBuilder(); // 拼接整行内容,匹配你要的输出格式 for (int i = 1; i <= columnCount; i++) { String columnName = rsmd.getColumnName(i); String value; int type = rsmd.getColumnType(i); // 根据列类型统一处理值的获取 switch (type) { case Types.VARCHAR: case Types.CHAR: value = resultSet.getString(i) == null ? "null" : resultSet.getString(i); break; case Types.DOUBLE: value = resultSet.getString(i) == null ? "null" : String.valueOf(resultSet.getDouble(i)); break; case Types.INTEGER: value = resultSet.getString(i) == null ? "null" : String.valueOf(resultSet.getInt(i)); break; case Types.DATE: value = resultSet.getString(i) == null ? "null" : resultSet.getDate(i).toString(); break; case Types.TIMESTAMP: value = resultSet.getString(i) == null ? "null" : resultSet.getTimestamp(i).toString(); break; case Types.BOOLEAN: value = resultSet.getString(i) == null ? "null" : (resultSet.getBoolean(i) ? "true" : "false"); break; case Types.DECIMAL: case Types.NUMERIC: value = resultSet.getString(i) == null ? "null" : resultSet.getBigDecimal(i).toString(); break; case Types.LONGVARCHAR: value = "longvarchar-content"; // 可根据实际需求调整默认值 break; default: value = "unsupported-type"; break; } // 构建列标题:第一行不加后缀,后续行添加rowIndex作为后缀 String columnLabel = columnName + (rowIndex == 0 ? "" : rowIndex); rowOutput.append(columnLabel).append("-").append(value); // 非最后一列添加空格分隔 if (i != columnCount) { rowOutput.append(" "); } } // 输出整行结果 System.out.println(rowOutput.toString()); // 每处理完一行,行索引递增 rowIndex++; } } }
关键修改说明
- 行号逻辑修正:用
rowIndex从0开始记录当前行,第一行(rowIndex=0)列标题无后缀,第二行(rowIndex=1)加1,完全匹配你的需求。 - 整行输出优化:使用
StringBuilder拼接整行内容,确保输出格式和你期望的一致(同一行的列用空格分隔),替代原代码每行输出单个列的逻辑。 - SQL适配:根据你给出的表格示例修正了查询列,你可以根据实际表结构调整。
- 代码精简:合并了同类列类型的处理逻辑,减少重复代码,同时确保每种数据类型都有对应的处理分支。
测试输出验证
对于你提供的表格数据:
STD ABC SSS AAA ----------------------- 123 222 333 123 ----------------------- 222 132 234 543
修改后的代码会输出:
STD-123 ABC-222 SSS-333 AAA-123 STD1-222 ABC1-132 SSS1-234 AAA1-543
若存在第三行数据,会自动输出STD2-xxx ABC2-xxx ...的格式,完全符合要求。
内容的提问来源于stack exchange,提问作者Routray
相关产品推荐
相关产品推荐

