如何在PostgreSQL中与PreparedStatement一起使用IN子句

如何在PostgreSQL中与PreparedStatement一起使用IN子句,sql,postgresql,jdbc,prepared-statement,Sql,Postgresql,Jdbc,Prepared Statement,我必须为Postgres数据库编写SQL查询,如下所示: DELETE FROM employee WHERE ename IN (?) 我想将ename传递为包含多个员工姓名的列表或字符串,例如“abc、bcd、efg”。如何设置值 如何在Postgres中将IN子句与PreparedStatement一起使用?您可能需要尝试以下方法: DELETE FROM employee WHERE ename IN ('abc', 'bcd', 'efg') 像这样: DELETE FROM

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

DELETE FROM employee WHERE ename IN (?)
我想将
ename
传递为包含多个员工姓名的列表或字符串,例如
“abc、bcd、efg”
。如何设置值


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

您可能需要尝试以下方法:

DELETE FROM employee 
 WHERE ename IN ('abc', 'bcd', 'efg')
像这样:

DELETE FROM employee WHERE ename = ANY(?)

参数的格式应为,例如,
“{abc,bcd,efg}”

有几种方法可以做到这一点。干净的方法是将数组传递给prepared语句。Nick回答的另一种方法是传递适当的
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
中没有前导空格,则比较将失败(这很可能)

如何在Postgressql中使用带有PreparedStatement的IN子句??改用数组:
其中ename=any()
。有趣的是,PostgreSQL将子句中的
转换为
=any(…)
,在内部,可以在查询计划中看到它。我使用的PreparedStatement可能重复,我们不知道需要删除多少记录。这将是动态的,因此,如何使用占位符,或者如果我们只能使用一个占位符,那么如何将值设置为列表或字符串。??不仅空格是一个问题,而且如果逗号是其中一个值的一部分,您将遇到问题。从我所能看出,没有办法逃脱。我能看到的最好的选择是使用
leafs\u just\u won\u stanley\u cup
作为分隔符,因为在SQL发明之前这就不是真的了,所以它不会是其中的一个值。效果很好,只是做了一点小改动:我不得不使用
连接。createArrayOf
而不是
连接。createArray
(保持参数不变)。谢谢