You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在多行数据库结果中为列标题添加行号后缀以区分行

解决多行查询结果列标题添加行号后缀的问题

我清楚你的需求:第一行的列标题保持原样(比如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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:45:17