如何使用 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。这是因为两个原因:
您使用此查询获取列名:SELECT * FROM PATHOLOGIES
。之后你 运行 通过你的结果集 while (resultNames.next()){
。这意味着如果您 table 中有 1000 行(不是列,行)称为 PATHOLOGIES,您将检查新列是否存在于您的 table 中 1000 次。如果需要,您尝试更改 table 1000 次(并在第二次后失败)。
- 对于每个结果行,您通读所有列名并使用
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
}
希望对您有所帮助。
我是 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。这是因为两个原因:
您使用此查询获取列名:
SELECT * FROM PATHOLOGIES
。之后你 运行 通过你的结果集while (resultNames.next()){
。这意味着如果您 table 中有 1000 行(不是列,行)称为 PATHOLOGIES,您将检查新列是否存在于您的 table 中 1000 次。如果需要,您尝试更改 table 1000 次(并在第二次后失败)。- 对于每个结果行,您通读所有列名并使用
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
}
希望对您有所帮助。