26

I have to write a SQL query for Postgres database as follows:

DELETE FROM employee WHERE ename IN (?)

I want to pass ename as list or string which will contain multiple employee names, e.g. "abc, bcd, efg". How to set the values?

How to use IN clause with PreparedStatement in Postgres?

2
  • How to use IN clause with PreparedStatement in Postgressql ?? Commented Apr 29, 2016 at 3:41
  • 1
    Use array instead: where ename = any(<array parameter or constant here>). Funny, but PostgreSQL transforms in clause into = any(...), internally, can see it in the query plans. Commented Apr 29, 2016 at 4:46

3 Answers 3

30

There are several ways to do this. The clean way is to pass an array to the prepared statement. An alternative to Nick's answer is to pass a proper java.sql.Array value:

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);

Another option is to use Postgres' string functions to convert the comma separated list to an array. That is probably the easiest way:

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

Note that you must not have spaces between the comma and the value! Those spaces will be part of the value that is stored in the array after string_to_array() has done it's job so comparison would e.g. be ename = ' bcd' which would fail if there is no leading space in the column ename(which is highly likely)

Sign up to request clarification or add additional context in comments.

2 Comments

Not only are spaces a problem, but if a comma is part of one of the values, you'll have trouble. From what I can tell, there's no way to escape it. The best option I can see is using the_leafs_just_won_the_stanley_cup as a delimiter, since that hasn't been true since before SQL was invented, so it wouldn't be one of the values.
Works good, minor change: I had to use connection.createArrayOf instead of connection.createArray (keep parameters the same). Thanks.
14

Like this:

DELETE FROM employee WHERE ename = ANY(?)

The parameter should be formatted as an array literal, e.g. "{abc,bcd,efg}".

1 Comment

The part about array literal formatting saved my day. I was trying to use in a prepared statement. Thanks
-13

You might want to try the below:

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

1 Comment

I am using PreparedStatement, we don't know how many records we need to delete. that will come dynamically. , so how use place holders, or if we can do with only one placeholder, then how to set the values as a List or String.???

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.