在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?

Posted

技术标签:

【中文标题】在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?【英文标题】:In Java DB2 JDBC: How can one use null parameters in a WHERE clause for a SELECT statement where the value can be either null or not null? 【发布时间】:2013-07-12 23:34:09 【问题描述】:

例如,我对 PreparedStatement 有以下选择查询:

“从 BAR WHERE FOOBAR= 中选择 FOO?”

FOOBAR 的参数可以有值,也可以为空。

下面的代码可以工作吗?

if(<condition>) preparedStatement.setString(1, "<string value>");
else preparedStatement.setString(1, null);

如果不是,应该如何处理?

【问题讨论】:

你试过空值的代码吗? 还没有,因为驱动我的程序的主查询需要几个小时才能执行。我正在处理数十万行。我认为询问可能比设置一个虚拟程序来测试这个特定的查询更快。 ***.com/questions/10610950/… 【参考方案1】:

根据 SQL 标准,如果列具有 NULL 值,则检查其是否具有 NULL 值的搜索条件是“column IS NULL”。如果列没有空值,您可以有条件,例如“column = 'blabla'。要使参数标记在两种情况下都有效,请将语句更改如下:

SELECT FOO FROM BAR WHERE COALESCE(FOOBAR, 'a') = ? "

并具有以下代码:

if(<condition>) preparedStatement.setString(1, "<string value>");
else preparedStatement.setString(1, "a");

@Mark 建议的任何内容都不适用于 Oracle。

【讨论】:

【参考方案2】:

空值参数和列中的空值之间存在差异。

【讨论】:

【参考方案3】:

它不起作用,null 没有等价物。如果您使用的是 PreparedStatement,请尝试以下操作:

if(<condition>) preparedStatement.setObject(1, "<string value>");
else preparedStatement.setNull(1, Types.VARCHAR);

它将 null 作为 IN 参数发送。

【讨论】:

谢谢。这似乎是一个可行的解决方案。会试试的。 如果这不起作用,请确保已导入 java.sql.Types 或将其设为 java.sql.Types.VARCHAR。 是的,Eclipse 自己导入了 java.sql.Types。它似乎正在工作。程序已经运行了 40 分钟,没有任何问题。它应该在一个小时左右完成。当我验证数据时,将确定它是否有效。干杯:)【参考方案4】:
if(requiredValue == null)
 sql = "SELECT * FROM Table Where COLUMN is NULL"

在这种情况下,您不必设置值。

【讨论】:

遇到空值时是否需要重新准备语句(因为我最初设置它是为了接受一个参数)?例如if(requiredValue is null) sql = "SELECT * FROM Table Where COLUMN is NULL" preparedStatement = conn.prepareStatement(sql); 是的。它基于您的设计。但我会喜欢这个 String sql = null; PreparedStatement ps = null; if(conditon) sql = NULL SQL 事物 ps = new PreparedStatement(sql); else sql = NOT NULL SQL 东西 ps = new PreparedStatement(sql); ps.setString(........) 嗯。我认为我的程序可能会因每次循环迭代重复准备语句而受到性能影响。在这种情况下,我认为设置两个语句可能会更好:一个用于空值,另一个用于非空值......但这似乎是一种粗略的方法。 正如我所说,这取决于您的设计。我在这里看不到任何性能问题。我看不到你完整的代码调用逻辑。所以没有 cmets :) @heisenbergman DB2 缓存预准备语句,因此拥有 2 个不同的预准备语句的开销非常小。

以上是关于在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?的主要内容,如果未能解决你的问题,请参考以下文章

如何给druid指定db2数据库jdbc驱动类

jsp用jdbc连接db2数据库的方法

Java通过jdbc连接DB2能使用with as( select ...吗

运行时:java.lang.ClassNotFoundException:类 jdbc:db2:\/\/localhost:50000\/

如何通过 JDBC 从 Db2 匿名块返回动态结果集?

我在哪里下载 DB2 8.1 的 jdbc 驱动程序?