在我的查询中(数据库是一个sql server)我使用RegEx来执行这样的select命令:
SELECT * FROM test WHERE id LIKE '1[2,3]'
(此查询已经过测试并返回我想要的数据)
我想在此RegEx中使用参数。为此,我将iReport $P{id}
中的Paramter定义为字符串,值为"1[2,3]"
。
在我的查询中,我现在使用这个参数:
SELECT * FROM test WHERE id LIKE $P{id}
结果我得到一个空白页面。我认为问题是参数的值用“”定义。但是''我得到一个编译器错误,该参数不是一个字符串。
我希望有人可以帮助我。
答案 0 :(得分:1)
LIKE
适用于文本值,而不适用于数值。由于id
是数字,因此请使用以下内容:
SELECT * FROM test WHERE id IN (12, 13)
带参数
SELECT * FROM test WHERE id IN ($P!{id_list})
并为参数提供以逗号分隔的ID列表。 bang(!)确保参数将按原样插入,不带字符串分隔符。
顺便说一下:LIKE (Transact-SQL)使用通配符,而非正则表达式。
您仍然可以使用LIKE
,因为在数据类型中存在implicit conversion到T-SQL中的文本,但这将导致(表或索引)扫描,其中{{1 }子句可以利用索引。
答案 1 :(得分:1)
接受的答案有效,但它正在使用字符串替换,阅读更多关于sql-injection,以了解为什么这不是好的做法。
在jasper报告中执行此IN
查询的正确方法(使用预准备语句)是:
SELECT * FROM test WHERE $X{IN, id, id_list}
有关使用NOTIN
,BETWEEN
ecc的更多信息。见JasperReports sample reference for query