gpt4 book ai didi

postgresql - SELECT 查询中的 PreparedStatement setNull

转载 作者:行者123 更新时间:2023-11-29 12:41:36 32 4
gpt4 key购买 nike

我将 Postgresql 与 HikariCP 一起使用,我的查询类似于

SELECT * FROM my_table WHERE int_val = ? ...

现在,我想为我的变量设置 NULL 值——我试过了

ps.setNull(1, Types.INTEGER); // ps is instance of PreparedStatement
try (ResultSet rs = ps.executeQuery()) {
... // get result from resultset
}

虽然我有符合条件的行(“int_val”列中的 NULL),但我没有收到任何记录。

问题出在(我认为)语句产生的查询中,看起来像:

System.out.println(ps.toString());
// --> SELECT * FROM my_table WHERE int_val = NULL ...

但是查询应该是这样的:

“SELECT * FROM my_table WHERE int_val IS NULL ...”——这个查询有效

我需要使用动态创建将包含 NULL 值的 PreparedStatements,因此我无法以某种方式轻松绕过它。

我已经尝试在没有 HikariCP 的情况下创建连接,结果相同,所以我认为问题出在 postgresql 驱动程序中?还是我做错了什么?

更新:

根据@Vao Tsun 的回答,我在 postgresql.conf 中设置了 transform_null_equals = on,它开始更改 val = null --> val is null 在“简单”语句中,但不在 PreparedStatements 中..

总结:

try (ResultSet rs = st.executeQuery(SELECT * FROM my_table WHERE int_val = NULL)){ 
// query is replaced to '.. int_val IS NULL ..' and gets correct result
}

ps.setNull(1, Types.INTEGER);
try (ResultSet rs = ps.executeQuery()) {
// Does not get replaced and does not get any result
}

我使用的是 JVM 版本 1.8.0_121,最新的 postgres 驱动程序 (42.1.4),但我也尝试过较旧的驱动程序 (9.4.1212)。数据库版本 -- PostgreSQL 9.6.2,由 Visual C++ build 1800 编译,64 位。

最佳答案

表示比较 x = null 等于 null 的行为(不管 x 等于什么)。基本上对于 SQL NULLunknown,而不是实际值...要绕过它,您可以将 transform_null_equals 设置为 ontrue。请查看文档:

https://www.postgresql.org/docs/current/static/functions-comparison.html

Some applications might expect that expression = NULL returns true if expression evaluates to the null value. It is highly recommended that these applications be modified to comply with the SQL standard. However, if that cannot be done the transform_null_equals configuration variable is available. If it is enabled, PostgreSQL will convert x = NULL clauses to x IS NULL.

关于postgresql - SELECT 查询中的 PreparedStatement setNull,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47340176/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com