在我的网站上,我需要使用最终用户提供的值执行通配符查询。最佳实践是使用PreparedStatement主要是为了避免SQL注入。我的查询非常长,所以这是一个例子:
String query = "SELECT ... FROM ... WHERE ..."+ //
"AND UPPER(CUST_NAME) LIKE UPPER('%?%')";
PreparedStatement pstmt = conn.prepareStatement(query);
stmt.setString(1, "joe");
问题是setString()抛出异常:SQL异常:列索引无效
答案 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%”)无法通过索引加速。