2016-04-29 44 views
1

我不得不寫Postgres數據庫的SQL查詢如下:如何子句中使用PreparedStatement的與PostgreSQL中

DELETE FROM employee WHERE ename IN (?) 

我想通過ename如列表或字符串,將包含多個員工姓名,例如"abc, bcd, efg"。如何設置值?

如何在Postgres中使用IN子句與PreparedStatement

+0

如何在Postgressql中使用PreparedStatement中的IN子句? – Ritesh

+0

用數組代替:'where ename = any(<數組參數或常量here>)'。有趣的是,PostgreSQL將in子句轉換爲'= any(...)',在內部可以在查詢計劃中看到它。 – Abelisto

+0

[PreparedStatement IN子句替代?]可能的重複(http://stackoverflow.com/questions/178479/preparedstatement-in-clause-alternatives) –

回答

-1

你可能想嘗試以下:

DELETE FROM employee 
WHERE ename IN ('abc', 'bcd', 'efg') 
+0

我正在使用PreparedStatement,我們不知道我們需要刪除多少條記錄。這將動態發生。 ,那麼如何使用佔位符,或者如果我們只能使用一個佔位符,那麼如何將值設置爲List或String。 – Ritesh

1

像這樣:

DELETE FROM employee WHERE ename = ANY(?) 

的參數應該被格式化爲array literal,例如"{abc,bcd,efg}"

4

有幾種方法可以做到這一點。乾淨的方法是將數組傳遞給準備好的語句。尼克的回答另一種方法是通過一個適當的java.sql.Array值:

PreparedStatement pstmt = connection.prepareStatement(
    "DELETE FROM employee WHERE ename = ANY (?)"); 
String[] idList = new String[] {"abc", "bcd", "efg"}; 
Array ids = connection.createArray("varchar", idList); 
pstmt.setArray(1, ids); 

另一種選擇是使用Postgres的字符串函數轉換的逗號分隔的列表到一個數組。這可能是最簡單的方法:

PreparedStatement pstmt = connection.prepareStatement(
    "DELETE FROM employee WHERE ename = ANY (string_to_array(?, ','))"); 
psmt.setString(1, "abc,bcd,efg"); 

請注意,您必須沒有逗號和值之間的空間!這些空格將作爲string_to_array()完成它的工作後存儲在數組中的值的一部分,以便比較例如是ename = ' bcd'如果在列中沒有前導空格ename(很有可能)會失敗

相關問題