如何在PostgreSQL中使用带有PreparedStatement的IN子句

时间:2016-04-29 03:36:30

标签: sql postgresql jdbc prepared-statement

我必须为Postgres数据库编写一个SQL查询,如下所示:

DELETE FROM employee WHERE ename IN (?)

我想将ename作为列表或字符串传递,其中包含多个员工姓名,例如"abc, bcd, efg"。如何设置值?

如何在Postgres中将IN子句与PreparedStatement一起使用?

3 个答案:

答案 0 :(得分:10)

有几种方法可以做到这一点。干净的方法是将数组传递给预准备语句。尼克答案的替代方法是传递适当的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会失败

答案 1 :(得分:4)

像这样:

select customer,sum(ach_val) from tbl_collection group by customer,month(date);

参数应格式化为array literal,例如DELETE FROM employee WHERE ename = ANY(?)

答案 2 :(得分:-6)

您可能想尝试以下内容:

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