Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.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 在多个用户输入为空时返回的SQL搜索_Java_Mysql_Sql - Fatal编程技术网

Java 在多个用户输入为空时返回的SQL搜索

Java 在多个用户输入为空时返回的SQL搜索,java,mysql,sql,Java,Mysql,Sql,这是我的难题,我正在尝试实现对我的网站的搜索,我有多个组合框,用户可以选择一个选项并按search,但我确实希望至少返回基于他们选择的存在内容,即如果他们将部分留空,只选择Semmer,那么我的结果集中应该有一些内容,或者,如果他们选择了学期和讲师,而其他人则为空,那么我的结果集中应该有一些东西,不幸的是它不起作用。这是我的问题 SELECT * FROM CoursesTaught c WHERE c.Section = :section AND c.CourseNa

这是我的难题,我正在尝试实现对我的网站的搜索,我有多个组合框,用户可以选择一个选项并按search,但我确实希望至少返回基于他们选择的存在内容,即如果他们将部分留空,只选择Semmer,那么我的结果集中应该有一些内容,或者,如果他们选择了学期和讲师,而其他人则为空,那么我的结果集中应该有一些东西,不幸的是它不起作用。这是我的问题

SELECT * 
  FROM CoursesTaught c 
 WHERE c.Section = :section 
       AND c.CourseName=:courseName 
       AND c.Semester=:semeste 
       AND c.programName=:ProgramName 
       AND c.CoordinatorName=:coordinatorname

基本上,我想做的是做一个检查,如果是空的,或者是“n/a”,而不是“和”做一个“或”,但我无法理解

根据用户选择动态生成查询。类似的问题以及如何在Java中执行此操作的答案:

除非您想要有一个非常难看的SQL查询,否则您需要使用服务器端语言来评估用户选择,并根据用户选择动态地将查询构建为查询字符串

可能最容易使用union运算符:


您可以手动创建查询字符串,即

String query = "SELECT * FROM CoursesTaught c ";
String whereCondition = "";

if(!section.isEmpty)
  if(whereCondition.isEmpty)
     whereCondition = whereCondition + " AND c.Section = '" + section + "'";
  else
     whereCondition = "c.Section = '" + section + "'";

if(!courseName .isEmpty)
  if(whereCondition.isEmpty)
     whereCondition = whereCondition + " AND c.CourseName  = '" + courseName  + "'";
  else
     whereCondition = "c.CourseName  = '" + courseName  + "'";
.
.
.

if(!whereCondition.isEmpty)
   query = query + whereCondition;

您可以将query字符串传递给您的executeQuery()方法。

使用
Jared\S
建议的方法,您可能会看到最佳性能,但您可以使用常规sql:

SELECT * 
  FROM CoursesTaught c 
 WHERE (c.Section = :section or :section is null)
       AND (c.CourseName=:courseName or :courseName is null)
       AND (c.Semester=:semester  or :semester is null)
       AND (c.programName=:ProgramName or :programName is null)
       AND (c.CoordinatorName=:coordinatorname or :coordinatorName is null)
这假设缺少的参数为null,如果不是简单地更改测试以查找空字符串(假设为参数类型)


这种方法的一个缺点是,如果所有参数都为空,您最终将返回整个表。

请澄清“我的结果集中的某些内容”的意思。@Joe我的意思是,至少应该显示匹配的那些内容。如果section='1'和sement=“”(即留空),则它不应返回0,至少应返回所有为1的节。@user2752552您需要对用户的输入进行适当的验证,并基于输入,使用连接准备查询。我的猜测是,您直接使用查询中表单中的ll字段的条件,即使用户将这些字段留空
SELECT * 
  FROM CoursesTaught c 
 WHERE (c.Section = :section or :section is null)
       AND (c.CourseName=:courseName or :courseName is null)
       AND (c.Semester=:semester  or :semester is null)
       AND (c.programName=:ProgramName or :programName is null)
       AND (c.CoordinatorName=:coordinatorname or :coordinatorName is null)