根据文本字段值修改select语句

时间:2012-11-10 00:37:07

标签: java mysql database jdbc prepared-statement

我有FirstNameLastNameIDdepartment四个文本字段。我让用户通过在文本字段中输入数据来搜索任何学生记录。当用户点击提交按钮时,我会显示一个与他请求的学生记录相对应的表格。因此,例如,如果用户输入computerScience department文本字段,我应该显示计算机科学部门的所有学生。

因此,我的SQL select语句应该能够在运行时执行此操作。

我正在使用这样的预备声明:

PreparedStatement pre = conn.prepareStatement("select ID,FirstName,LastName,Dept from student where ID = ? or FirstName = ? or lastName = ? or Dept = ?");

但是,只有在输入ID时才会显示结果。但是,如果有人只是输入“标记”作为姓氏并将所有其他文本字段留空,则此查询不显示任何内容,尽管在数据库中有姓氏为Mark的学生。

有人能指导我吗?

2 个答案:

答案 0 :(得分:3)

使用如下的动态查询字符串(假设最少一个标准是prsent)

   String query = "select ID,FirstName,LastName,Dept from student where ";
   String delim = "";
   if(firstName != null){
      query+ = delim + "FirstName = '"+firstName+"'";
      delim = " AND ";
   }
   if(lastName != null){
      query+ = delim + "LastName = '"+lastName +"'";
      delim = " AND ";
   }
   .........
   .........
   PreparedStatement pre = conn.prepareStatement(query);

希望这有帮助!

答案 1 :(得分:0)

您可以使用其他评论和答案中提到的动态方法。 但在这种情况下,由于列本身不会在运行时添加,因此也可以使用另一种方法:将语句更改为:

PreparedStatement pre = conn.prepareStatement("select ID,FirstName,LastName,Dept from student where ID = IFNULL(?,ID) and FirstName = IFNULL(?,FirstName) AND lastName = IFNULL(?,lastName) and Dept = IFNULL(?,Dept)");

注意所有条件都更改为“和”而不是“或”。 要了解发生了什么:让我们举个例子“Dept = IFNULL(?,Dept)” 在这里,如果你传递的值为null(用户没有选择一个部门),那么IFNULL(?,Dept)将从db中的当前行评估为Dept,整个条件Dept = IFNULL(?,Dept)将评估为true因为部门与自己相等。否则,如果发送一个值,则IFNULL(?,Dept)将计算该值,并且仅当该行中的dept等于该值时才选择该行。其他部分也是如此,这就是为什么使用“和”。 实际上,每个条件都会确保如果有值,则该行必须具有相同的值才能返回。否则,条件不会阻止行!!!

作为最后一点,您必须确保如果用户在字段中没有选择任何数据,则将NULL作为该字段的值传递给db(从空格中注意)。 如果字段ID是数字,那么您需要更改上面的部分,使其类似于以下内容(并确保在用户选择无ID的情况下发送0):ID = IFNULL (NULLIF(?,0),ID)

PreparedStatement pre = conn.prepareStatement("select ID,FirstName,LastName,Dept from student where ID = IFNULL(NULLIF(?,0),ID) and FirstName = IFNULL(?,FirstName) AND lastName = IFNULL(?,lastName) and Dept = IFNULL(?,Dept)");