我直接使用postgresjdbc驱动程序
该url只适用于一个sql,而不适用于另一个sql
String url = "jdbc:log4jdbc:postgresql://localhost:5432/staging_incomingdb?user=" +
username + "&password=" + password +"&options=-c transform_null_equals=on";
请注意,transform_null_equals将所有c.col=null转换为c.col is null
然后我运行它,它工作。。
PreparedStatement st = conn.prepareStatement("select * from CUSTOMER_ORIGINAL_ADDRESS\n" +
"customeror0_ left outer join CUSTOMER_PRACTICE practices1_ on customeror0_.id=practices1_.address_id\n" +
"where customeror0_.onBehalfOfClientId=? and customeror0_.addr1=? and customeror0_.addr2=NULL");
st.setString(1, "dean");
st.setString(2, "200 Patewood Dr");
然后我运行这个不起作用的程序
PreparedStatement st = conn.prepareStatement("select * from CUSTOMER_ORIGINAL_ADDRESS\n" +
"customeror0_ left outer join CUSTOMER_PRACTICE practices1_ on customeror0_.id=practices1_.address_id\n" +
"where customeror0_.onBehalfOfClientId=? and customeror0_.addr1=? and customeror0_.addr2=?");
st.setString(1, "dean");
st.setString(2, "200 Patewood Dr");
st.setString(3, null);
因此,当我将param设置为null时,它不会被转换。有什么办法解决这个问题吗?基本上,第二个查询在应该返回结果时返回0个结果。第一个查询返回由于设置而应该返回的结果。
我怀疑它与在将参数发送到postgres之前将查询发送到postgres有关。如果我是对的,这就引出了一个问题:有没有设置让postgres在收到所有参数之前不编译我的查询,因为我们总是将参数与查询一起发送?
2条答案
按热度按时间l7mqbcuq1#
我想你的期望是什么
transform_null_equals
这是错误的。引用手册
请注意,此选项仅影响确切的形式
= NULL
,而不是其他比较运算符或其他在计算上等价于包含equals运算符的表达式的表达式。(我的重点)
换句话说:它不会以这种方式处理产生null的表达式,只有在关键字
NULL
在sql字符串中显式使用。我猜在这种情况下,准备语句的参数也被视为表达式。
在pl/pgsql中使用绑定变量时也会发生同样的情况:
如果
some_parameter
为空,即使transform_null_equals
打开并some_column
包含空值。ifmq2ha22#
我怀疑,正如你所说,
transform_null_equals
不适用于准备好的语句。幸运的是,postgres支持
null
-安全相等,带标准运算符is [not] distinct from
. 我建议更换:使用: