我有FirstName
,LastName
,ID
和department
四个文本字段。我让用户通过在文本字段中输入数据来搜索任何学生记录。当用户点击提交按钮时,我会显示一个与他请求的学生记录相对应的表格。因此,例如,如果用户输入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的学生。
有人能指导我吗?
答案 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)");