如何在 java 中使用 jdbc 编写选择查询需要检查 COLUMN 是不是为 NULL?

Posted

技术标签:

【中文标题】如何在 java 中使用 jdbc 编写选择查询需要检查 COLUMN 是不是为 NULL?【英文标题】:HOW to write select query in java using jdbc where to need to check if COLUMN IS NULL?如何在 java 中使用 jdbc 编写选择查询需要检查 COLUMN 是否为 NULL? 【发布时间】:2019-03-27 12:51:14 【问题描述】:

尝试使用 jdbc oracle 驱动程序在 java 中的 select 查询中写入条件 ind 为空。

代码:

完成所有数据库连接

info.add("CN");
info.add("NULL");

试过了:

ResultSet rs1 = st.executeQuery("select COUNT(*) from TABLENAME where A='" + info.get(i) +  " and  ind is'" +info.get(i+1) + " '");

注意:使用 oracle 驱动 JDBC API。

从数组列表中获取空值。但它没有从数据库中获取正确的值。

代码:

完成所有数据库连接

info.add("CN");
info.add("NULL");

ResultSet rs1 = st.executeQuery("select COUNT(*) from TABLENAME where A='" + info.get(i) +  " and  ind IS '" +info.get(i+1) + " '");

我希望输出像计数(行数):

基本的 sql 查询(如果在 DB 中使用):

select COUNT(*) 
from TABLENAME 
where A= 'a'   
 and  ind IS null;

【问题讨论】:

什么是信息的数据类型 不要将类似的值连接到 SQL 字符串中。学会正确使用PreparedStatement 【参考方案1】:

首先处理 NULL 不同于处理值:

ind IS NULL
ind = '...'

这使得使用准备好的语句变得困难。但是应该使用 PreparedStatement,不仅用于安全(针对 SQL 注入),还用于转义单引号等。并且是类型安全的,因为它使用类型和转换。

Oracle SQL 的一个缺陷是它无法区分 NULL 和 '',因此您可以选择 ''。独立于甲骨文的是:

// Typed fields:
String a = ...;
int n = ...;
String ind = null;

String sql = ind == null
    ? "select COUNT(*) from TABLENAME where A=? and n=? and ind is null"
    : "select COUNT(*) from TABLENAME where A=? and n=? ind = ?";
try (PreparedStatement stmt = new PreparedStatement(sql)) 
   stmt.setString(1, a);
   stmt.setInt(2, n);
   if (ind != null) 
       stmt.setString(3, ind);
   
   try (ResultSet rs = stmt.executeQuery()) 
       long count = rs.next() ? rs.getLong(1) : 0L;

       return count;
   

Try-with-resources 关闭语句和结果集,中间也抛出异常或返回。

对于一般的对象列表,可以使用一个用于循环构造 SQL 模板,另一个用于设置 PreparedStatement 的字段。

【讨论】:

【参考方案2】:

这部分:

" and  ind is'" +info.get(i+1) + " '");

生成以下 SQL:

  and ind is 'NULL ';

这是错误的,因为它会抛出错误:

ORA-00908: 缺少 NULL 关键字

您需要将其更改为:

" and ind is " +info.get(i+1));

但是对于非空值它将不再起作用。

【讨论】:

以上是关于如何在 java 中使用 jdbc 编写选择查询需要检查 COLUMN 是不是为 NULL?的主要内容,如果未能解决你的问题,请参考以下文章

JDBC Like子句实例

使用Spark实现推主机群Hive数据到租户集群Hive的高性能Hive2Hive数据集成Java需编写JDBC连接Hive解析元数据

使用Spark实现推主机群Hive数据到租户集群Hive的高性能Hive2Hive数据集成Java需编写JDBC连接Hive解析元数据

如何通过对不同列使用可重用代码在 JDBC 中编写一个更新查询(更新 1 列)?

如何使用带有 PySpark 的 WHERE 子句在 AWS Glue 中查询 JDBC 数据库?

Java -- JDBC_利用反射及 JDBC 元数据编写通用的查询方法