birt修改sql

使用过birt的同学都知道,birt可以通过传入不同的参数来选择我们要查询的条件。我们都知道在birt的where后面,我们可以将需要通过参数传入的查询的条件设为?,这样当你传入不同的值时,该值就会把?替换掉。简而言之,这个?类似于正则表达式中需要替换的内容。比如,我们有一个table_A,里面的字段有name, age, gender, salary和title。比如我想要查询gender为不同值时所对应的数据的个数。我们就可以设置一个参数,它的值是"male"和“female”,这样根据传入的参数的不同的值得到我们想要的结果。这个sql语句就可以这么写:

select * from table_A where gender = ?
但是有时候,我们不仅仅想把条件作为参数传入到最终的sql语句中,我们还想把talbe作为参数传进去,到时候sql语句根据传入的不同的table名,输出我们对应想要的结果。最初,想着我直接把table名给用?替换了是不是就可以了,就如下所示:

select * from ? where gender = "male"
birt直接就给报错了,看来这样简单的把传条件到sql语句中的方法直接生搬硬套过去是不可行的。那我确实有这样的需求,到底该怎么去实现呢? 我自己并没有想到解决方法,然后就去问一个牛人,他给出了他的解决方法。在此我就把该牛人的实现方法介绍一下,供大家参考学习。

首先打开一个dataSet,然后打开Script页面,页面左上角的Script:选择下拉菜单的“beforeOpen”.

//save current query as a template
queryTemplate = this.queryText

//clear the query
this.queryText = ""

//rebuild the query
for ( i = 0; i < params["p_plat_arch"].value.length; i++){
	if ( i > 0 ){
		this.queryText += "UNION\n"
	}
	platArch = params["p_plat_arch"].value[i]
	thisQuery = queryTemplate.replaceAll("c64_beagle", platArch)
	thisQuery = thisQuery.replaceAll("test_case_name\\ \\=\\ \\'::NONE'", "test_case_name = '"+params["p_testcase"]+"'")
	this.queryText += thisQuery.replaceAll("c64_beagle_fft_bench_test",platArch+"_"+params["p_algorithm"]+"_bench_test")+"\n"

}

reportContext.setPersistentGlobalVariable("SQLDEBUG",this.queryText);
其中的query如下:

SELECT
	avg_value,
	min_value,
	max_value,
	test_case_name,
	changelist,
	'c64_beagle' as platform_arch
FROM
	c64_beagle_fft_bench_test
WHERE
	test_case_name = '::NONE'
简单来说,就是在执行sql语句之前,把c64_beagle_fft_bench_test的表给替换成:platArch+"_"+params["p_algorighm"]+"_bench_test")+"\n" 。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值