Postgresql 在postgres下将PreparedStatement参数设置为null的正确方法

Postgresql 在postgres下将PreparedStatement参数设置为null的正确方法,postgresql,jdbc,Postgresql,Jdbc,im使用JDBC4(通过JDK6)连接到postgresql 9.0,使用最新的JDBC4驱动程序 conn = dpaDs.getConnection(); PreparedStatement stmt = conn.prepareStatement("delete from fss where f_id=? and f_lastmodified=?"); UUID target = UUID.fromString("8c5c5ac2-3a2a-49f3-ae48-29226d6ea3e7")

im使用JDBC4(通过JDK6)连接到postgresql 9.0,使用最新的JDBC4驱动程序

conn = dpaDs.getConnection();
PreparedStatement stmt = conn.prepareStatement("delete from fss where f_id=? and f_lastmodified=?");
UUID target = UUID.fromString("8c5c5ac2-3a2a-49f3-ae48-29226d6ea3e7");
stmt.setObject(1, target, 1111);
//non of these work
//stmt.setNull(2,93);
//stmt.setObject(2,null, 93);
//stmt.setObject(2,null, java.sql.Types.NULL);
//stmt.setNull(2, java.sql.Types.NULL);
int rowCount = stmt.executeUpdate();
int g = 8;
将第二个参数设置为null的正确方法是什么? 我知道我可以使用“where…f_lastmodified为null”,但是没有办法绕过这个问题吗?

这是行不通的

无法使用
=
运算符进行空比较。如果要测试NULL,必须使用
,f_lastmedited为NULL


不能在IS NULL条件的准备语句中使用参数。

如果使用命名参数(例如:p而不是?)而不是位置参数,则可以执行以下操作:

((:p is null and f_lastmodified is null) or f_lastmodified = :p)

这有点尴尬,但它完成了任务。我没有在jdbc上尝试过这一点,只有.net上的Npgsql,但我认为应该是相同的。

在postgres中,您可以使用
与实际上是空安全平等检查的
没有区别

如果将查询更改为“使用不区分”,它现在将允许您将null设置为参数2

delete
  from fss
 where f_id = ?
   and f_lastmodified is not distinct from ?

我想那是
?IS NULL
在准备好的语句中很好,看起来它解决了OP的问题。还有一个问题是,
操作符没有区别,尽管我看到PG似乎无法将其与索引一起使用时感到不快?IS NULL
将不起作用,因为这需要传递列名作为参数,而PreparedStatements不支持此操作。postgresql jdbc是唯一一个不支持有效方法的数据库。有关行业标准的讨论,请参见。试试Oracle、SQL Server、MySQL、HSQL和Sybase。请参阅和邮件列表pgsql中的讨论“无法在ISNULL查询中传递null参数”-jdbc@postgresql.org对于另一个非常引人注目的用例,其中空检查甚至由ISNULL条件保护。