Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中正确编写带有if条件的sql查询_Java_Sql_Conditional Statements_H2 - Fatal编程技术网

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

如何在java中正确编写带有if条件的sql查询,java,sql,conditional-statements,h2,Java,Sql,Conditional Statements,H2,我是Java的新手,正在开发一个应用程序,用于一些医学测试。我有一个窗口,医生可以在其中输入受试者的人口统计和病理数据。对于病理学,有一系列用于最常见病理学的复选框,以及一个带有文本字段的组合框,用于添加其他病理学。 下面这段代码的问题是,prepared语句中的条件不起作用,因此,程序总是试图添加一个新列,即使它已经存在。 显然,如果组合框中存在病理学,我希望数据库中有一个新条目。如果没有,我希望在其名称后创建一个新列,并在这个新列中创建一个条目。 我尝试过使用Stringbuilder,如本

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

试试看{
语句state5=DatabaseConnection.getInstance().createStatement(ResultSet.TYPE\u SCROLL\u敏感,ResultSet.CONCUR\u可更新);
String query5=“选择*来自病理学”;
ResultSet resultNames=state5.executeQuery(查询5);
while(resultNames.next()){
ResultSetMetaData metaPatho=resultNames.getMetaData();

对于(int i=1;i您不能使用此查询添加名为
nomDBFinal
的新列:

  "ALTER TABLE PATHOLOGIES ADD "+nomDBFinal+" varchar(60)"
 "insert into PATHOLOGIES (ID_SUJET, "+nomDBFinal+")
因为您已经有了此列
nomDBFinal
请查看此查询:

  "ALTER TABLE PATHOLOGIES ADD "+nomDBFinal+" varchar(60)"
 "insert into PATHOLOGIES (ID_SUJET, "+nomDBFinal+")

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

  "ALTER TABLE PATHOLOGIES ADD "+nomDBFinal+" varchar(60)"
 "insert into PATHOLOGIES (ID_SUJET, "+nomDBFinal+")
因为您已经有了此列
nomDBFinal
请查看此查询:

  "ALTER TABLE PATHOLOGIES ADD "+nomDBFinal+" varchar(60)"
 "insert into PATHOLOGIES (ID_SUJET, "+nomDBFinal+")

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

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

  • 对于每个结果行,通读所有列名并使用
    if(metaNomsDB.equals(nomDBFinal)){
    条件检查列名是否为新列名。但如果表中有10列,则它只能为true一次,将为false 9次,因此您将尝试为每个结果行更改表9次
  • 您需要在两个地方修改代码。首先更改查询以仅获得一个结果行,然后在更改表之前检查所有列名

    查询可以是这样的:

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

    希望能有所帮助。

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

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

  • 对于每个结果行,通读所有列名并使用
    if(metaNomsDB.equals(nomDBFinal)){
    条件检查列名是否为新列名。但如果表中有10列,则它只能为true一次,将为false 9次,因此您将尝试为每个结果行更改表9次
  • 您需要在两个地方修改代码。首先更改查询以仅获得一个结果行,然后在更改表之前检查所有列名

    查询可以是这样的:

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

    希望这会有帮助。

    您是否单独检查了查询?您是否单独检查了查询?确实,这很有帮助,非常感谢。您的解决方案非常符合逻辑,现在我看到了:)但我的表Pathologies中似乎有两个条目,只有第二个条目记录了新数据(第一个条目是空行);这在现有列和新列的情况下都是如此。你知道为什么吗?这有助于解决我的组合框问题:)谢谢!不客气:)我不确定我是否理解你的问题,但这是否意味着,你的代码每次都会生成两个INSERT语句?在这种情况下,没有错误您使用的条件可能有问题。您能发布代码的这一部分吗?是的,每次都有两个insert,第一个为null。第二个insert包含正确的数据。代码与我发布的原始代码非常相似,但有您建议的修改。请参阅我编辑这些代码。谢谢!好的,找出原因。这是becau在代码前面的se中,我有一个语句记录了一些最常见的病理情况的复选框。空条目是该语句的结果,与组合框无关。因此,根据您的解释,一切正常:)在一些罕见的情况下,将同时使用复选框和组合框,我只需在o中记录这两个复选框ne语句。(我删除了帖子的编辑部分以避免混淆)。的确,这很有帮助,非常感谢。现在我看到,您的解决方案非常符合逻辑:)但我的表Pathologies中似乎有两个条目,只有第二个条目记录了新数据(第一个条目是空行);在现有专栏和新专栏中都是这样。你知道为什么吗?这有助于说明问题