0

这是我的困境,我正在尝试实现对我的网站的搜索,而我拥有的是多个组合框,用户可以选择一个选项并按搜索,但是我确实希望至少根据他们的选择返回存在的内容,即如果他们将部分留空,并且只选择学期,那么我的结果集中应该有一些东西,或者如果他们选择学期和讲师,而将其他部分留空,那么我的结果集中应该有一些东西,不幸的是它不起作用. 这是我的查询。

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”,而不是“AND”做一个“OR”,但我无法弄清楚。

4

5 回答 5

0

根据用户选择动态构建查询。与如何在 Java 中执行此操作类似的问题:如何根据用户的选择动态生成 SQL 查询?

于 2013-09-12T13:14:42.533 回答
0

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

于 2013-09-12T13:19:20.730 回答
0

可能最容易使用联合运算符:

http://www.w3schools.com/sql/sql_union.asp

SELECT * FROM CoursesTaught c
WHERE c.Section = :section
union
SELECT * FROM CoursesTaught c
WHERE c.Semester=:semeste
于 2013-09-12T13:28:10.660 回答
0

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

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;

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

于 2013-09-12T13:41:03.507 回答
0

使用建议的方法,您可能会看到最佳性能,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)

这假设缺少的参数为空,如果不是简单地更改测试以查找空字符串,假设这是参数类型。

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

于 2013-09-12T13:41:18.083 回答