2011-11-29 36 views
1
上查询条款

我有以下查询:如何使用,如果在iReport的

SELECT COLUMN1, COLUMN2, COUNT(*) 
FROM TABLE 
WHERE COLUMN3 IS NOT NULL 
    AND COLUMN4 = 1 
    AND COLUMN5 = 4 
    AND COLUMN6 = 43 
    AND COLUMN7 = $P{YEAR} 
    AND COLUMN8 = $P{IT} 
GROUP BY COLUMN1, COLUMN2 
ORDER BY COLUMN1 ASC 

我不知道是否有可能做这样的事情:

SELECT COLUMN1, COLUMN2, COUNT(*) 
FROM TABLE 
WHERE COLUMN3 IS NOT NULL 
    AND COLUMN4 = 1 
    AND COLUMN5 = 4 
    AND COLUMN6 = 43 
    AND COLUMN7 = $P{YEAR} 
    IF ($P{IT} != 'ALL') { AND COLUMN8 = $P{IT} } 
GROUP BY COLUMN1, COLUMN2 
ORDER BY COLUMN1 ASC 

换句话说,我想只有当“$ P {IT}”值不是“ALL”时才添加到where子句“AND COLUMN8 = $ P {IT}”。这意味着如果报告必须按“COLUMN8”列进行过滤。

是否有人知道这是可能的?还有其他方法可以完成这项工作吗?

我试图执行上面的查询,但我得到了'编译运行时间'。

在此先感谢。

回答

1

是的,你可以在iReport中做到这一点。但你需要稍微改观一下。你需要第二个参数。保留$ P {IT},并添加$ P {IT_SQL}。给$ P {IT_SQL}默认值是这样的:

$P{IT}.equals("ALL") ? "" : " AND COLUMN8 = '" + $P{IT} + "'" 

然后将查询应该是这样的:

SELECT COLUMN1, COLUMN2, COUNT(*) 
FROM TABLE 
WHERE COLUMN3 IS NOT NULL 
    AND COLUMN4 = 1 
    AND COLUMN5 = 4 
    AND COLUMN6 = 43 
    AND COLUMN7 = $P{YEAR} 
    $P!{IT_SQL} 
GROUP BY COLUMN1, COLUMN2 
ORDER BY COLUMN1 ASC 

这会给你想要的SQL(!无)时$ P {IT }的值为“ALL”,当$ P {IT}的值为“abc”时,它会给你想要的SQL(COLUMN8 ='abc')。

+0

谢谢。这是什么意思$ P,$ P **!** {IT_SQL}之后的感叹号?对不起,这是因为我几乎是iReport的新手。 – ceochronos

+0

@madahlman我做了同样的事情,但我得到了'Target Eception:java.lang.NullPointerException' – Raghu

+0

@Raghu,这意味着$ P {IT}为空,并且$ P {IT} .equals()会抛出异常。确保$ P {IT}已初始化。或者也许你可以改变逻辑:“ALL”.equals($ P {IT})我发现很难阅读/维护,但它可能很容易避免NPE。 – mdahlman