有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在java中正确编写带有if条件的sql查询

我是Java的新手,正在开发一个应用程序,用于一些医学测试。我有一个窗口,医生可以在其中输入受试者的人口统计和病理数据。对于病理学,有一系列用于最常见病理学的复选框,以及一个带有文本字段的组合框,用于添加其他病理学。 下面这段代码的问题是,prepared语句中的条件不起作用,因此,程序总是试图添加一个新列,即使它已经存在。 显然,如果组合框中存在病理学,我希望数据库中有一个新条目。如果没有,我希望在其名称后创建一个新列,并在这个新列中创建一个条目。 我尝试过使用Stringbuilder,就像在这篇文章中:SQL conditional statement;但这并没有解决问题。在使用正则语句时也是如此。 我正在使用Eclipse,应用程序中嵌入了一个H2数据库。 有人能点燃我的蜡烛吗? 谢谢

    try{
Statement state5=DatabaseConnection.getInstance().createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
                String query5="SELECT * FROM PATHOLOGIES";
                ResultSet resultNames=state5.executeQuery(query5);
                while (resultNames.next()){
                    ResultSetMetaData metaPatho=resultNames.getMetaData();
                    for(int i=1; i<=metaPatho.getColumnCount(); i++){
                        metaNomsDB=metaPatho.getColumnName(i);
                        if (metaNomsDB.equals (nomDBFinal)){
                            PreparedStatement newDataPatho2 = DatabaseConnection.getInstance().prepareStatement("insert into PATHOLOGIES (ID_SUJET, "+nomDBFinal+") "
                                    + "values (?, ?)");
                            newDataPatho2.setString(1, result4.getString("ID_SUJET"));
                            newDataPatho2.setString(2, nomDBFinal);
                            newDataPatho2.executeUpdate();
                            newDataPatho2.close();
                        }
                        else {
                            PreparedStatement newDataPatho3 = DatabaseConnection.getInstance().prepareStatement("ALTER TABLE PATHOLOGIES ADD "+nomDBFinal+" varchar(60)");
                            newDataPatho3.executeUpdate();
                            newDataPatho3.close();
                            PreparedStatement newDataPatho4 = DatabaseConnection.getInstance().prepareStatement("insert into PATHOLOGIES (ID_SUJET, "+nomDBFinal+") "
                                    + "values (?, ?)");
                            newDataPatho4.setString(1, result4.getString("ID_SUJET"));
                            newDataPatho4.setString(2, nomDBFinal);
                            newDataPatho4.executeUpdate();
                            newDataPatho4.close();
                        }
                        }
                    }
                state5.close();
                result4.close();
                state4.close();
                resultNames.close();

            } catch(Exception e){
                e.printStackTrace();
                }

堆栈跟踪:

    org.h2.jdbc.JdbcSQLException: Duplicate column name "MAL_AU_GENOU"; SQL statement:ALTER TABLE PATHOLOGIES ADD MAL_AU_GENOU varchar(60) [42121-176]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
at org.h2.message.DbException.get(DbException.java:178)
at org.h2.message.DbException.get(DbException.java:154)
at org.h2.table.Table.setColumns(Table.java:399)
at org.h2.table.TableBase.<init>(TableBase.java:45)
at org.h2.table.RegularTable.<init>(RegularTable.java:75)
at org.h2.schema.Schema.createTable(Schema.java:585)
at org.h2.command.ddl.AlterTableAlterColumn.cloneTableStructure(AlterTableAlterColumn.java:318)
at org.h2.command.ddl.AlterTableAlterColumn.copyData(AlterTableAlterColumn.java:226)
at org.h2.command.ddl.AlterTableAlterColumn.update(AlterTableAlterColumn.java:158)
at org.h2.command.CommandContainer.update(CommandContainer.java:79)
at org.h2.command.Command.executeUpdate(Command.java:254)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:158)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:144)
at com.app.MenuInfoSujet$BoutonMenuEpreuves.actionPerformed(MenuInfoSujet.java:823)

共 (2) 个答案

  1. # 1 楼答案

    您会得到异常,因为您的代码多次尝试更改您的表。这是因为两个原因:

    1. 您可以使用此查询获取列名:SELECT * FROM PATHOLOGIES。然后用while (resultNames.next()){运行结果集。这意味着,如果在名为PATHOLOGIES的表中有1000行(不是列、行),则将检查新列是否在表中存在1000次。如果需要,您可以尝试更改表1000次(第二次更改后失败)

      1. 对于每个结果行,通读所有列名,并使用if (metaNomsDB.equals (nomDBFinal)){条件检查列名是否为新列名。但是,如果表中有10列,它只能为true一次,将为false 9次,因此您将尝试为每个结果行修改表9次

    您需要在两个地方修改代码。首先更改查询以仅获取1个结果行,然后在更改表之前检查所有列名

    查询可以是这样的:

    String query5="SELECT *, rownum FROM PATHOLOGIES where rownum = 1";
    

    然后使用布尔变量检查nem列是否存在:

    boolean newColumn = true;
    for(int i=1; i<=metaPatho.getColumnCount(); i++){
    metaNomsDB=metaPatho.getColumnName(i);
       if (metaNomsDB.equals (nomDBFinal)){
         newColumn = false;
       }
    }
    

    仅在需要时更改表格:

    if(newColumn){
    //ALTER and INSERT
    } else {
    //only INSERT
    }
    

    希望有帮助

  2. # 2 楼答案

    无法使用此查询添加名为nomDBFinal的新列:

      "ALTER TABLE PATHOLOGIES ADD "+nomDBFinal+" varchar(60)"
    

    因为您已经有了这个列nomDBFinal请查看此查询:

     "insert into PATHOLOGIES (ID_SUJET, "+nomDBFinal+")