4

例如,我有一个声明

"SELECT * FROM Reports WHERE StartDate >= ? WHERE EndDate <= ? AND Performer = ?"

但是有时网页上的某些输入字段没有填写,所以我必须不考虑这种情况。即我没有填写开始日期,所以声明必须是

"SELECT * FROM Reports WHERE EndDate <= ? AND Performer = ?"

有3种不同的条件。那么,我是否必须编写 8 种不同的语句和 DAO 方法才能完成任务?真的吗?也许还有其他解决方案?

编辑:我使用 MySQL/

4

3 回答 3

9

更改您的 SQL 以适应空值。因为您没有告诉我们您使用的是哪个数据库,所以我将使用“vanilla”SQL:

SELECT * 
FROM Reports
WHERE (EndDate <= ? OR ? is null)
AND (Performer = ? OR ? is null)

每次将参数传递两次。

另一种选择是根据参数为空来更改 SQL(例如Performer = ?从 where 子句中省略),但这可能需要大量代码和测试。我会使用适应性强的 SQL,如果它表现不佳,那么尝试更高级的东西。

于 2012-04-15T10:30:02.723 回答
0

您不需要 8 种不同的语句。您可以使用 if 语句构建查询。例如,

String query = "SELECT * FROM Reports where true";
if(startDate != null)
  query = query + " and startDate <= ?";
if(endDate != null)
  query = query + " and endDate <= ?";
if(performer != null)
  query = query + " and performer = ?";

希望对你有效。

于 2012-04-15T10:37:26.480 回答
0

没有准备好的语句不能单独排除条件。构造查询以避免不必要的条件。

您可以使用以下代码生成 SQL:

StringBuilder whereClause = new StringBuilder();
String and = "";

if(EndDate == null || EndDate.length == 0)
{
    whereClause.append(your condition);
    and = " and";
}

if(StartDate == null || StartDate.length == 0)
{
    whereClause.append(and).append(your condition);
    and = " and";
}

if(Performer == null || Performer.length == 0)
{
    whereClause.append(and).append(your condition);
}

并根据您生成的查询,您需要将参数设置为准备好的语句。

于 2012-04-15T10:43:35.403 回答