2016-04-29 11 views
1

でのPreparedStatementで句で使用する方法:次のように私はPostgresデータベースのためのSQLクエリを記述する必要がPostgreSQLの

DELETE FROM employee WHERE ename IN (?) 

は、私は、例えば、複数の従業員の名前が含まれていますリストや文字列、などenameを渡したいです"abc, bcd, efg"。値の設定方法は?

IN句をPreparedStatementと一緒にPostgresに使用するには?

+0

Post句でPreparedStatementを使用してIN節を使用する方法はありますか? – Ritesh

+0

代わりに、 'ename = any(<配列パラメータまたは定数>)'を使用してください。面白いですが、PostgreSQLは 'in'節を' = any(...) 'に変換し、内部的にはクエリプランでそれを見ることができます。 – Abelisto

+0

[PreparedStatement IN句の代替案]の可能な複製?(http://stackoverflow.com/questions/178479/preparedstatement-in-clause-代替案) –

答えて

-1

あなたは以下しようとする場合があります:このように

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

私はPreparedStatementを使用していますが、削除する必要のあるレコードの数はわかりません。それは動的に来るでしょう。だから、どのように場所の所有者を使用するか、または1つのプレースホルダだけでできたら、リストや文字列として値を設定する方法??? – 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の列に先頭の空白がないと失敗します(これはおそらくそうです)

関連する問題