如何使用 java 中的 if 条件正确编写 sql 查询

How to correctly write an sql query with if conditions in java

我是 Java 的新手,我正在开发一个用于一些医学测试的应用程序。我得到了一个 window,从业者在其中输入受试者的人口统计和病理数据。对于病症,有一系列用于最常见病症的复选框,以及一个带有用于添加其他病症的文本字段的组合框。 下面这段代码的问题是准备好的语句中的条件不起作用,因此,程序总是试图添加一个新列,即使它已经存在。 显然,如果组合框中存在病理,我需要在数据库中添加一个新条目。如果没有,我希望在其名称后创建一个新列,并在此新列中创建一个条目。 我试过使用 Stringbuilder,就像这样 post : 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)

您不能使用此查询添加名为 nomDBFinal 的新列:

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

因为你已经有了这个列nomDBFinal看这个查询:

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

你得到了异常,因为你的代码试图多次改变你的 table。这是因为两个原因:

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

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

您需要在两个地方修改您的代码。首先更改您的查询以仅获取 1 个结果行,然后在更改 table.

之前检查所有列名

查询可能是这样的:

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;
   }
}

仅在需要时更改您的 table:

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

希望对您有所帮助。