2011-08-25 31 views
2

在我的網站上,我需要使用最終用戶提供的值執行通配符查詢。最好的做法是使用PreparedStatement來避免SQL注入。我的查詢是非常非常長,所以這是一個例子:如何在變量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

找到答案:用'UPPER(CONCAT(CONCAT('%',?),'%')''替換'UPPER'('%?%')')'有沒有人有任何其他更好的建議? – Bryan

回答

4

相反使用可以使用的concat運算符

like upper('%' || ? || '%') 

稍微更具可讀性。

+0

MS SQL: like upper('%'+?+'%') – Candice

3

嘗試:

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

替換...

UPPER('%?%') 

...與...

UPPER(?) 

...然後設置的參數值:

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

BTW這個查詢有表現不佳的潛力。爲了獲得良好的性能,您需要UPPER(CUST_NAME)上的功能索引(CUST_NAME上的「正常」索引是不夠的)您只需要按前綴查詢(例如「joe%」)即可。通過索引查詢後綴(如「%joe」或「%joe%」)無法加快查詢速度。