从 SQL 转换和打印结果集

问题描述 投票:0回答:1

我对 SQL 和 Java 很陌生,对我正在做的示例练习有疑问。我正在尝试转换此表:

SELECT id, lname, fname, credit, year, course 
FROM records
WHERE id is NOT NULL
ORDER BY last_name, first_name;
身份证 l姓名 f名称 信用 课程
01001 亚当斯 约翰 博士 N 1110
01001 亚当斯 约翰 博士 N 2001
01001 亚当斯 约翰 博士 N 2115
02003 亚历山大 艾米 医学博士 N 1002
02003 亚历山大 艾米 医学博士 N 1016
02003 亚历山大 艾米 医学博士 N 1019
02003 亚历山大 艾米 医学博士 N 1008
02003 亚历山大 艾米 医学博士 N 2110
02003 亚历山大 艾米 医学博士 N 2010
02003 亚历山大 艾米 医学博士 N 2030
02003 亚历山大 艾米 医学博士 N 2200
02003 亚历山大 艾米 医学博士 N 2201
02003 亚历山大 艾米 医学博士 N 2310
01400 安德森 路易丝 博士 N 2311
01400 安德森 路易丝 博士 N 2361
01400 安德森 路易丝 博士 N 2062
01400 安德森 路易丝 博士 N 2008
01400 安德森 路易丝 博士 N 2002

将第 N 年列转换为:

01 年:有 1110

02年:有2110

03 年:没有 (1110; 2110; 3110)

这样程序就会打印出这样的东西:

身份证 l姓名 f名称 信用
0100 亚当斯 约翰 博士 01
02003 亚历山大 艾米 医学博士 02
01400 安德森 路易丝 博士 03

我有一个编码如下的结果集:


String SQL = " SELECT id, lname, fname, credit, year, course "
           + " FROM records "
           + " WHERE id is NOT NULL "
           + " ORDER BY last_name, first_name; "
PreparedStatement printSQL = connection.prepareStatement(SQL);
ResultSet rs = printSQL.executeQuery();

while(rs.next()) {
     if(year.equals("N") && course.equals("1110")) {
          year = "01";
     }
     else if(year.equals("N") && course.equals("2110")) {
          year = "02";
     }
     else if(year.equals("N") && (!course.equals("1110") 
            && !course.equals("2110")&& !course.equals("3110"))){
          year = "03";
     }
}

但它只检查第一个人或最后一个人,而不检查所有具有 1110、2110 或不具有 1110、2110 和 3110 的行。感谢任何帮助!

java sql jdbc resultset
1个回答
0
投票

您是否希望将多行折叠为单行来表示学生所在的年级?我建议在 sql 中执行此操作,而不要使用 java:

select  id, lname, fname, credit
,   coalesce(
        MAX(case when course = '1110' then '01' end)
    ,   MAX(case when course = '2110' then '02' end)
    ,   '03'
    ) as year
from
(
    VALUES  (N'01001', N'Adams', N'John', N'PHD', N'N', 1110)
    ,   (N'01001', N'Adams', N'John', N'PHD', N'N', 2001)
    ,   (N'01001', N'Adams', N'John', N'PHD', N'N', 2115)
    ,   (N'02003', N'Alexander', N'Amy', N'MD', N'N', 1002)
    ,   (N'02003', N'Alexander', N'Amy', N'MD', N'N', 1016)
    ,   (N'02003', N'Alexander', N'Amy', N'MD', N'N', 1019)
    ,   (N'02003', N'Alexander', N'Amy', N'MD', N'N', 1008)
    ,   (N'02003', N'Alexander', N'Amy', N'MD', N'N', 2110)
    ,   (N'02003', N'Alexander', N'Amy', N'MD', N'N', 2010)
    ,   (N'02003', N'Alexander', N'Amy', N'MD', N'N', 2030)
    ,   (N'02003', N'Alexander', N'Amy', N'MD', N'N', 2200)
    ,   (N'02003', N'Alexander', N'Amy', N'MD', N'N', 2201)
    ,   (N'02003', N'Alexander', N'Amy', N'MD', N'N', 2310)
    ,   (N'01400', N'Anderson', N'Louise', N'PHD', N'N', 2311)
    ,   (N'01400', N'Anderson', N'Louise', N'PHD', N'N', 2361)
    ,   (N'01400', N'Anderson', N'Louise', N'PHD', N'N', 2062)
    ,   (N'01400', N'Anderson', N'Louise', N'PHD', N'N', 2008)
    ,   (N'01400', N'Anderson', N'Louise', N'PHD', N'N', 2002)
) t (ID,lName,fName,credit,year,course)
group by id, lname, fname, credit

这称为条件聚合。您可以在 CASE WHEN 内调节您想要看到的内容并将其包裹在 MAX 周围。这将返回您正在查找的值或 NULL。

通过使用 COALESCE,您可以获取第一个 NULL,然后它会告诉您学生是否有 1110、2110 或没有。

© www.soinside.com 2019 - 2024. All rights reserved.