【问题标题】:How to use IN clause with PreparedStatement in PostgreSQL如何在 PostgreSQL 中将 IN 子句与 PreparedStatement 一起使用
【发布时间】:2016-08-24 01:41:39
【问题描述】:

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

DELETE FROM employee WHERE ename IN (?)

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

如何在 Postgres 中使用 IN 子句和 PreparedStatement

【问题讨论】:

  • 如何在 Postgressql 中将 IN 子句与 PreparedStatement 一起使用??
  • 使用数组代替:where ename = any(<array parameter or constant here>)。有趣,但是PostgreSQL在内部将in子句转换为= any(...),可以在查询计划中看到。

标签: sql postgresql jdbc prepared-statement


【解决方案1】:

您可能想尝试以下方法:

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

【讨论】:

  • 我用的是PreparedStatement,不知道要删除多少条记录。那将是动态的。 ,那么如何使用占位符,或者如果我们只能使用一个占位符,那么如何将值设置为列表或字符串。???
【解决方案2】:

有几种方法可以做到这一点。干净的方法是将数组传递给准备好的语句。尼克的答案的替代方法是传递一个正确的 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 列中没有前导空格,则会失败(很有可能)

【讨论】:

  • 不仅空格是个问题,而且如果逗号是其中一个值的一部分,你就会遇到麻烦。据我所知,没有办法逃脱它。我能看到的最好的选择是使用the_leafs_just_won_the_stanley_cup 作为分隔符,因为在 SQL 发明之前就不是这样了,所以它不会是值之一。
  • 效果很好,小改动:我不得不使用connection.createArrayOf 而不是connection.createArray(保持参数相同)。谢谢。
【解决方案3】:

像这样:

DELETE FROM employee WHERE ename = ANY(?)

参数的格式应为array literal,例如"{abc,bcd,efg}".

【讨论】:

    猜你喜欢
    • 2011-03-21
    • 1970-01-01
    • 2019-09-05
    • 2011-10-21
    • 2012-12-01
    • 2022-12-31
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多