我必须为Postgres数据库编写一个SQL查询,如下所示:
DELETE FROM employee WHERE ename IN (?)
我想将ename
作为列表或字符串传递,其中包含多个员工姓名,例如"abc, bcd, efg"
。如何设置值?
如何在Postgres中将IN
子句与PreparedStatement
一起使用?
答案 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')