iReport中条件执行PostgreSQL SQL报错问题及解决咨询
iReport PostgreSQL 动态SQL问题解答
Hey there, let's break down your iReport issues step by step:
1. 如何在iReport中条件执行SQL语句?
在iReport里实现条件执行SQL,核心是用动态SQL表达式结合参数判断,具体操作如下:
- 首先在报表的「Query」设置里选择「Use expression」(使用表达式)来编写动态查询
- 用Java三元运算符做条件分支,注意两个关键细节:
- 绝对不能用
$P{personelId}.equals(null)判断空值——当personelId本身为null时,这会直接抛出空指针异常,正确写法是$P{personelId} == null - 如果需要直接插入参数值,可使用
$P!{参数名}语法(字符串类型需自行处理引号),或者手动拼接字符串
- 绝对不能用
- 基础示例逻辑:
$P{personelId} == null ? "查询语句1" : "查询语句2"
2. 双SQL语句报错的原因及修复方法
报错根源分析
从你提供的代码来看,主要有3个致命问题:
- 空值判断错误:
$P{personelId}.equals(null)会触发空指针异常,导致表达式直接解析失败 - SQL语法混乱:第二个SQL的
f_grp_prod函数调用部分多写了一个$P{yil} || ''',拼接后SQL结构完全错乱,PostgreSQL无法解析 - 虽然你用了PostgreSQL的美元引号
$$处理嵌套引号,但空值判断的逻辑错误直接阻断了后续的SQL解析
修复后的完整代码
以下是修正后的动态SQL表达式,解决了所有问题:
$P{personelId} == null ? "select veriler.*, toplamgun.miktar from (select * from crosstab('select id, ad, soyad, calisma_tipi, sgk_no, ihale_tarihi, giris_tarihi, cikis_tarihi, pirim_gun_sayisi, gun, izin_durum from f_grp_prod('''|| $P{ay} ||''', ''' || $P{yil} || ''' ) order by 1,2', $$values ('1'::text), ('2'), ('3'), ('4'), ('5'),('6'), ('7'), ('8'), ('9'), ('10'),('11'), ('12'), ('13'), ('14'), ('15'),('16'), ('17'), ('18'), ('19'), ('20'),('21'), ('22'), ('23'), ('24'), ('25'),('26'), ('27'), ('28'), ('29'), ('30'),('31')$$) as t("id" bigint, "ad" text, "soyad" text, "calisma_tipi" text, "sgk_no" text, "ihale_tarihi" text, "giris_tarihi" text, "cikis_tarihi" text, "pirim_gun_sayisi" text, "1" text, "2" text, "3" text, "4" text, "5" text, "6" text, "7" text, "8" text, "9" text, "10" text, "11" text, "12" text, "13" text, "14" text, "15" text, "16" text, "17" text, "18" text, "19" text, "20" text, "21" text, "22" text, "23" text, "24" text, "25" text, "26" text, "27" text, "28" text, "29" text, "30" text, "31" text))veriler inner join (select count(izin_durum) as miktar, id from f_grp_prod('01','2019') where izin_durum = 'X' group by id) toplamgun on veriler.id = toplamgun.id" : "select veriler.*, toplamgun.miktar from (select * from crosstab('select id, ad, soyad, calisma_tipi, sgk_no, ihale_tarihi, giris_tarihi, cikis_tarihi, pirim_gun_sayisi, gun, izin_durum from f_grp_prod('''|| $P{ay} ||''', ''' || $P{yil} || ''' ) order by 1,2', $$values ('1'::text), ('2'), ('3'), ('4'), ('5'),('6'), ('7'), ('8'), ('9'), ('10'),('11'), ('12'), ('13'), ('14'), ('15'),('16'), ('17'), ('18'), ('19'), ('20'),('21'), ('22'), ('23'), ('24'), ('25'),('26'), ('27'), ('28'), ('29'), ('30'),('31')$$) as t("id" bigint, "ad" text, "soyad" text, "calisma_tipi" text, "sgk_no" text, "ihale_tarihi" text, "giris_tarihi" text, "cikis_tarihi" text, "pirim_gun_sayisi" text, "1" text, "2" text, "3" text, "4" text, "5" text, "6" text, "7" text, "8" text, "9" text, "10" text, "11" text, "12" text, "13" text, "14" text, "15" text, "16" text, "17" text, "18" text, "19" text, "20" text, "21" text, "22" text, "23" text, "24" text, "25" text, "26" text, "27" text, "28" text, "29" text, "30" text, "31" text))veriler inner join (select count(izin_durum) as miktar, id from f_grp_prod('01','2019') where izin_durum = 'X' group by id) toplamgun on veriler.id = toplamgun.id"
关键修复点说明
- 将
$P{personelId}.equals(null)替换为$P{personelId} == null,彻底避免空指针异常 - 删除了第二个SQL中多余的
$P{yil} || ''',修正了f_grp_prod函数的调用语法 - 保留了你原本正确的PostgreSQL
crosstab美元引号用法(这是处理嵌套引号的最佳实践)
内容的提问来源于stack exchange,提问作者leventkalayz
相关产品推荐
相关产品推荐

