3

我已经解决了这个问题一段时间,希望你能帮助我。

我有一份关于 iReport 的报告,即使某些参数为空,我也希望填写该报告。

这就是我所拥有的

SELECT
    evento."titulo" AS evento_titulo,
    evento."data_inicio_realizacao" AS evento_data_inicio_realizacao,
    evento."data_fim_realizacao" AS evento_data_fim_realizacao,
    evento."id" AS evento_id
FROM
    "public"."evento" evento
WHERE
    evento."id" = $P{eventoid} OR
    evento."data_inicio_realizacao" BETWEEN $P{data1} AND $P{data2}

我希望 WHERE 子句是可选的,即,如果我将这些参数保留为空(或在 id 的情况下为 0 值),我想获取所有值而不是空白报告。

可能吗?我发现有些人制作了 $P{WHERE_CLAUSE} 并将整个 where 子句作为其值传递,但它对我不起作用。

4

3 回答 3

7

你可以这样做,而不是你现在正在做的动态 sql...

select xxx
from <table>
where $P{eventoid} is null or evento."id" = $P{eventoid}

不好意思回复这么老的帖子了。。。

于 2012-07-20T00:19:15.040 回答
2

好吧,我更努力地尝试并弄清楚如何通过在 $P{} 参数中传递整个 WHERE 子句来使其工作。

我只是删除了整个 WHERE 子句并将其放入:

$P!{whereClause}

我在其中放置了一个参数,并从报告中删除了三个参数 $P{eventoid}、$P{data1} 和 $P{data2}。

我正在使用 Spring MVC 并在我的类 Controller 中,在该页面的 POST 请求映射下,我添加了一个名为 whereClause 的字符串变量,并将其值设置为“WHERE 1=1”(如果您愿意,也可以设置为 true):

String whereClause = "WHERE 1=1";

if (relIndice.getEventoId() != 0) {
    whereClause += " AND evento.id = " + relIndice.getEventoId().toString();
}

if (relIndice.getData1() != null) {
    whereClause += " AND evento.data_inicio_realizacao >= '" + relIndice.getData1().toString() + "'";
}

if (relIndice.getData2() != null) {
whereClause += " AND evento.data_inicio_realizacao <= '" + relIndice.getData2().toString() + "'";
}

whereClause += " ORDER BY evento.data_inicio_realizacao";

在为 whereClause 变量设置初始值后,我在 SQL 中创建了 3 个 IF 语句,每个语句用于我想要包含在 WHERE 语句中的字段之一。

由于“WHERE 1=1 无论如何都会运行,因此在 AND 之前需要一个空格,以便生成干净且有效的语法。

最后,我添加了一个 ORDER BY 子句,它也将运行。就是这样,您的参数值将是您从要使用的 getter 中获得的值。

在我的情况下,我可以将任何值保留为 null 或零(在 eventtoId 的情况下,因为它是一个 int),并且我将拥有该表中的所有记录,因为 SELECT 语句不会看到 WHERE 子句......因为它没有不存在!

感谢你们!

于 2011-01-19T06:00:35.677 回答
0

evento."data_inicio_realizacao" $P{data1} 和 $P{data2} 之间

尝试替换这个

( (evento."data_inicio_realizacao" >= $P{data1} or $P{data1} is null) or (evento."data_inicio_realizacao" <= $P{data2} or $P{data2} is null) )

于 2011-01-18T11:30:44.627 回答