2012-11-16 50 views
3

所以在我的節目,我有:使用「%」作爲參數的通配符在SQL和Java

private static final String GET_USERS_BY_PARAMS = "select * from user t " 
     + "where t.id like %?% " 
     + "AND t.name LIKE %?% " 
     + "AND t.location LIKE %?% " 
     + "AND t.telephone LIKE %?% "; 

上述所有的參數都存儲在數據庫中的varchar。

然而,當我運行以下命令:

statement = connection.prepareStatement(GET_USERS_BY_SEARCH_PARAMS); 
      statement.setString(1, userID); 
      statement.setString(2, name); 
      statement.setString(3, location); 
      statement.setString(4, telephone()); 

      rs = statement.executeQuery(); 

我得到一個SQL異常,指出有一個無效字符。應用程序在executeQuery上拋出錯誤,因此設置params不是問題。我想知道這是否是使用%符號,我列入,這樣你就可以搜索而不必輸入確切的用戶ID,名稱等。

感謝您提前提供任何幫助!

+1

非常感謝大家的回答:)有時我討厭我只能接受一個的事實! – TangoKilo

回答

4

通配符必須是傳遞給準備語句的值的一部分。所以,你需要的東西是這樣的:

private static final String GET_USERS_BY_PARAMS = "select * from user t " 
    + "where t.id like ? " 
    + "AND t.name LIKE ? " 
    + "AND t.location LIKE ? " 
    + "AND t.telephone LIKE ? "; 

statement = connection.prepareStatement(GET_USERS_BY_SEARCH_PARAMS); 
statement.setString(1, "%" + userID + "%"); 
statement.setString(2, "%" + name + "%"); 
statement.setString(3, "%" + location + "%"); 
statement.setString(4, "%" + telephone() + "%"); 

順便說一句:什麼數據類型爲user.id

如果這是一個數值,LIKE將無法正常工作。你或許應該explictely投的ID爲一個字符值改爲:where to_char(t.id) like ?

+0

用戶ID是一個字符串,例如「USER_1234」,所以它運作良好,但感謝您的額外信息! – TangoKilo

2

使用CONCAT功能,它會工作,像這樣:LIKE CONCAT('%', ?, '%')
或者你也可以使用LIKE ('%' || ? || '%')

2

您可以使用連接運算符寫

LIKE ('%' || ? || '%')