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

Rit*_*esh 5 sql postgresql jdbc prepared-statement

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

DELETE FROM employee WHERE ename IN (?)
Run Code Online (Sandbox Code Playgroud)

我想传递ename包含多个员工姓名的列表或字符串,例如"abc, bcd, efg".如何设置值?

如何在Postgres中使用IN子句PreparedStatement

a_h*_*ame 11

有几种方法可以做到这一点.干净的方法是将数组传递给预准备语句.尼克答案的替代方法是传递适当的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);
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用Postgres的字符串函数将逗号分隔列表转换为数组.这可能是最简单的方法:

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

请注意,逗号和值之间不能有空格!在string_to_array()完成它的工作之后,这些空间将成为存储在数组中的值的一部分,因此ename = ' bcd'如果列中没有前导空格ename(很可能),那么比较将会失败

  • 不仅空格是个问题,而且如果逗号是其中一个值的一部分,您就会遇到麻烦。据我所知,没有办法摆脱它。我能看到的最佳选择是使用 `the_leafs_just_won_the_stanley_cup` 作为分隔符,因为在 SQL 发明之前就不是这样了,所以它不会是值之一。 (6认同)
  • 效果很好,有一些小变化:我必须使用“connection.createArrayOf”而不是“connection.createArray”(保持参数相同)。谢谢。 (2认同)

Nic*_*nes 7

像这样:

DELETE FROM employee WHERE ename = ANY(?)
Run Code Online (Sandbox Code Playgroud)

参数应格式化为数组文字,例如"{abc,bcd,efg}".


小智 -10

您可能想尝试以下操作:

DELETE FROM employee 
 WHERE ename IN ('abc', 'bcd', 'efg')
Run Code Online (Sandbox Code Playgroud)