如何在 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?的主要内容,如果未能解决你的问题,请参考以下文章
使用Spark实现推主机群Hive数据到租户集群Hive的高性能Hive2Hive数据集成Java需编写JDBC连接Hive解析元数据
使用Spark实现推主机群Hive数据到租户集群Hive的高性能Hive2Hive数据集成Java需编写JDBC连接Hive解析元数据
如何通过对不同列使用可重用代码在 JDBC 中编写一个更新查询(更新 1 列)?