如何在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)
# 1 楼答案
您会得到异常,因为您的代码多次尝试更改您的表。这是因为两个原因:
您可以使用此查询获取列名:
SELECT * FROM PATHOLOGIES
。然后用while (resultNames.next()){
运行结果集。这意味着,如果在名为PATHOLOGIES的表中有1000行(不是列、行),则将检查新列是否在表中存在1000次。如果需要,您可以尝试更改表1000次(第二次更改后失败)if (metaNomsDB.equals (nomDBFinal)){
条件检查列名是否为新列名。但是,如果表中有10列,它只能为true一次,将为false 9次,因此您将尝试为每个结果行修改表9次李>您需要在两个地方修改代码。首先更改查询以仅获取1个结果行,然后在更改表之前检查所有列名
查询可以是这样的:
然后使用布尔变量检查nem列是否存在:
仅在需要时更改表格:
希望有帮助
# 2 楼答案
无法使用此查询添加名为
nomDBFinal
的新列:因为您已经有了这个列
nomDBFinal
请查看此查询: