oracle传入一个可能为空的参数进行查询
在我们数据库的表中的某些字段可能为空,且传入的查询参数也可能为空。
例如
select psm.mapping_id,psm.party_id,psm.vendor_id,psm.supplier_reg_id from pos_supplier_mappings psm where psm.mapping_id in (3324,4520067,4520097);
其查询结果集如下
| MAPPING_ID | PARTY_ID | VENDOR_ID | SUPPLIER_REG_ID | 
| 3324 | 6092236 | 3761 | |
| 4520067 | 1 | ||
| 4520097 | 29 | 
大多数情况下,我们在java中拼接sql语句时候会判断传入的参数是否为空,
//组织ID
if((vendor_id != null)&&(!"".equals(vendor_id)))
{
if (clauseCount > 0) {
whereClause.append(" AND ");
}
whereClause.append("vendor_id = :");
whereClause.append(++bindCount);
parameters.addElement(vendor_id);
clauseCount++;
}
else{
if (clauseCount > 0) {
whereClause.append(" AND ");
}
whereClause.append("vendor_id is null");
clauseCount++;
}
拼接出的SQL大多如下:
select psm.mapping_id,psm.party_id,psm.vendor_id,psm.supplier_reg_id from pos_supplier_mappings psm where psm.vendor_id is null;
select psm.mapping_id,psm.party_id,psm.vendor_id,psm.supplier_reg_id from pos_supplier_mappings psm where psm.party_id is null;
select psm.mapping_id,psm.party_id,psm.vendor_id,psm.supplier_reg_id from pos_supplier_mappings psm where psm.supplier_reg_id is null;
这样的拼接是繁琐的,并且容易出错。
方案二:灵活使用nvl(param1,param2)函数。
原始SQL如下:
SELECT psm.mapping_id,
psm.party_id,
psm.vendor_id,
psm.supplier_reg_id
FROM pos_supplier_mappings psm
WHERE nvl(psm.party_id,
-99) = nvl(:1,
nvl(psm.party_id,
-99))
AND nvl(psm.vendor_id,
-99) = nvl(:2,
nvl(psm.vendor_id,
-99))
AND nvl(psm.supplier_reg_id,
-99) = nvl(:3,
nvl(psm.supplier_reg_id,
-99))
思路,若传入的参数为空,那么则与表中的空值的列恒等。
传参形式如下:
this.setWhereClauseParam(0, PARTY_ID);
this.setWhereClauseParam(1, VENDOR_ID);
this.setWhereClauseParam(2, SUPPLIER_REG_ID);
注:在传入参数的时候不能使用以下形式
String PARTY_ID = PARTY_ID+"";
此形式会导致在SQL中将空值的PARTY_ID变为字符串'null'。
oracle传入一个可能为空的参数进行查询的更多相关文章
- oracle判断一个字段为空
		比如 insert into table a (a1,b1)values("a1",''); 对于这种情况,因为表里存的是'',其实是没有内容的,要查询这个字段,不能直接使用 se ... 
- mybatis中传入一个List集合作为查询条件的参数
		如果有一个查询参数有多个,用一个List集合传进去,这个mapper文件可以这么写 <select id="queryList04" resultType="map ... 
- 自动化测试(三)如何用python写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复。
		写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复.邮箱前面的长度是6-12之间,产生的邮箱必须包含大写字母.小写字母.数字和特殊字符 和上一期一样 代码中间有段比较混沌 有 ... 
- oracle 11g导出少了空表,原因分析
		oracle 11g导出少了空表 使用exp命令的时候,会出现少表的情况,是因为在11g版本中如果一个表里面是空的,为了节省空间,默认是不会给这个表分配空间的,在导出的时候也就不会将空表导出的,自然导 ... 
- Oracle,Mysql ,SQL Server 三大数据库带参数的模糊查询,  拼接查询条件问题
		最近项目开发一直在不断切换数据库,有时候一条sql 要同时考虑多种数据库中的兼容问题 , 先总结一条模糊查询拼接查询条件的问题,后续追加总结. 目前使用 mybatis: 1. Oracle 中使 ... 
- #定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型。其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数)。
		#定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型.其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数). def get_num(num): i ... 
- [Oracle][Standby][PDB]在PDB中修改参数,设置范围为 SPFILE,报 ORA-65099错误
		[Oracle][Standby][PDB]在PDB中修改参数,设置范围为 SPFILE,报 ORA-65099错误 在Data Gaurd 的 Standby (或 CDB 是 Read Only ... 
- ORACLE中一个字符占多少字节?
		问题描述 或许你会说一个中文字符占2个字节,这是一定的?如何计算一个字符串的字节数? 解决方案 在oracle中一个字符特别是中文占几个字节是不同的. 比如我创立一个表create table tes ... 
- 安装ORACLE时在Linux上设置内核参数的含义
		前两天看到一篇Redhat官方的Oracle安装文档,对于Linux内核参数的修改描述的非常清晰. 安装Oracle之前,除了检查操作系统的硬件和软件是否满足安装需要之外,一个重点就是修改内核参数,其 ... 
随机推荐
- 使用基于 PHP 的开源软件 YOURLS 搭建短链接地址服务
			使用基于 PHP 的开源软件 YOURLS搭建 系统配置 php7.1+mysql5.7+nginx 下载源代码 git clone https://github.com/YOURLS/YOURLS. ... 
- Elasticsearch 疑难解惑
			Elasticsearch是如何实现Master选举的? Elasticsearch的选主是ZenDiscovery模块负责的,主要包含Ping(节点之间通过这个RPC来发现彼此)和Unicast(单 ... 
- bzoj1633 / P2875 [USACO07FEB]牛的词汇The Cow Lexicon
			P2875 [USACO07FEB]牛的词汇The Cow Lexicon 三维dp 它慢,但它好写. 直接根据题意设三个状态: $f[i][j][k]$表示主串扫到第$i$个字母,匹配到第$j$个单 ... 
- 05: MySQLdb  原生SQL语句操作数据库
			1.1 MySQLdb安装与简介 1.MySQLdb 模块的安装(python3中目前这个模块还不可用)参考博客 1. linux: yum install MySQL-python 2. windo ... 
- 《课程设计》——cupp的使用
			<课程设计>--cupp的使用 cupp简介 cupp是强大的字典生成脚本.它是一款用Python语言写成的可交互性的字典生成脚本.尤其适合社会工程学,当你收集到目标的具体信息后,你就可以 ... 
- noip 2014 提高组 Day 2
			1.无线网络发射器选址 这道题数据范围很小,就直接暴力枚举就好了.为了提高速度,就从每个有公共场所的点枚举周围在(x,y)放无线网路发射器可以增加的公共场所数量,加到一个数组里.所有公共场所都处理完了 ... 
- HDU 4135 Co-prime(容斥:二进制解法)题解
			题意:给出[a,b]区间内与n互质的个数 思路:如果n比较小,我们可以用欧拉函数解决,但是n有1e9.要求区间内互质,我们可以先求前缀内互质个数,即[1,b]内与n互质,求互质,可以转化为求不互质,也 ... 
- 使用CLR Profiler查看C#运行程序的内存占用情况
			http://blog.csdn.net/wy3552128/article/details/8158938 https://msdn.microsoft.com/en-us/library/ff65 ... 
- Sass常用写法
			Sass使用变量,变量以$开头 $bgcolor:#f40; background-color:$bgcolor; 如果变量需要嵌套在字符串当中,就需要写在#{}之中 $direction:left; ... 
- 【NOI2013】树的计数
			Description 我们知道一棵有根树可以进行深度优先遍历(DFS)以及广度优先遍历(BFS)来生成这棵树的DFS序以及BFS序.两棵不同的树的DFS序有可能相同,并且它们的BFS序也有可能相同, ... 
