如何在PreparedStatement中使用带有变量的SQL通配符

时间:2011-08-25 23:41:04

标签: java sql oracle prepared-statement

在我的网站上,我需要使用最终用户提供的值执行通配符查询。最佳实践是使用PreparedStatement主要是为了避免SQL注入。我的查询非常长,所以这是一个例子:

String query = "SELECT ... FROM ... WHERE ..."+ //
"AND UPPER(CUST_NAME) LIKE UPPER('%?%')";
PreparedStatement pstmt = conn.prepareStatement(query);
stmt.setString(1, "joe");

问题是setString()抛出异常:SQL异常:列索引无效

3 个答案:

答案 0 :(得分:4)

您可以使用

代替使用concat运算符
like upper('%' || ? || '%')

稍微可读。

答案 1 :(得分:3)

尝试:

String query = "SELECT ... FROM ... WHERE ..."+ //
"AND UPPER(CUST_NAME) LIKE UPPER(?)";
PreparedStatement pstmt = conn.prepareStatement(query);
stmt.setString(1, "%joe%");

答案 2 :(得分:1)

替换...

UPPER('%?%')

...与...

UPPER(?)

...然后将参数值设置为:

pstmt.setString(1, "%joe%");

BTW此查询可能会导致性能下降。为了获得良好的性能,您需要UPPER(CUST_NAME)上的功能索引(CUST_NAME上的“正常”索引是不够的)您只需按前缀查询(例如“乔%”)。后缀查询(例如“%joe”或“%joe%”)无法通过索引加速。