在查询中使用RegEx的String参数

时间:2016-08-03 14:19:26

标签: sql-server jasper-reports

在我的查询中(数据库是一个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}

结果我得到一个空白页面。我认为问题是参数的值用“”定义。但是''我得到一个编译器错误,该参数不是一个字符串。

我希望有人可以帮助我。

2 个答案:

答案 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}

有关使用NOTINBETWEEN ecc的更多信息。见JasperReports sample reference for query