0

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

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

我正在使用这样的准备好的语句:

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

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

有人可以在这里指导我吗?

4

2 回答 2

3

使用如下动态查询字符串(假设至少存在一个条件)

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

希望这可以帮助!

于 2012-11-10T00:54:49.060 回答
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)");

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

最后一点,您必须确保如果用户在该字段中未选择任何数据,则将 NULL 作为该字段的值传递给数据库(注意空格)。并且如果字段 ID 是 numeric,那么您需要将上面的部分更改为如下所示(并确保在用户选择 no 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)");
于 2012-11-10T01:28:25.440 回答