在我们数据库的表中的某些字段可能为空,且传入的查询参数也可能为空。

例如

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传入一个可能为空的参数进行查询的更多相关文章

  1. oracle判断一个字段为空

    比如 insert into table a (a1,b1)values("a1",''); 对于这种情况,因为表里存的是'',其实是没有内容的,要查询这个字段,不能直接使用 se ...

  2. mybatis中传入一个List集合作为查询条件的参数

    如果有一个查询参数有多个,用一个List集合传进去,这个mapper文件可以这么写 <select id="queryList04" resultType="map ...

  3. 自动化测试(三)如何用python写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复。

    写一个函数,这个函数的功能是,传入一个数字,产生N条邮箱,产生的邮箱不能重复.邮箱前面的长度是6-12之间,产生的邮箱必须包含大写字母.小写字母.数字和特殊字符 和上一期一样 代码中间有段比较混沌 有 ...

  4. oracle 11g导出少了空表,原因分析

    oracle 11g导出少了空表 使用exp命令的时候,会出现少表的情况,是因为在11g版本中如果一个表里面是空的,为了节省空间,默认是不会给这个表分配空间的,在导出的时候也就不会将空表导出的,自然导 ...

  5. Oracle,Mysql ,SQL Server 三大数据库带参数的模糊查询, 拼接查询条件问题

    最近项目开发一直在不断切换数据库,有时候一条sql 要同时考虑多种数据库中的兼容问题 , 先总结一条模糊查询拼接查询条件的问题,后续追加总结. 目前使用   mybatis: 1. Oracle 中使 ...

  6. #定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型。其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数)。

    #定义一个方法get_num(num),num参数是列表类型,判断列表里面的元素为数字类型.其他类型则报错,并且返回一个偶数列表:(注:列表里面的元素为偶数). def get_num(num): i ...

  7. [Oracle][Standby][PDB]在PDB中修改参数,设置范围为 SPFILE,报 ORA-65099错误

    [Oracle][Standby][PDB]在PDB中修改参数,设置范围为 SPFILE,报 ORA-65099错误 在Data Gaurd 的 Standby (或 CDB 是 Read Only ...

  8. ORACLE中一个字符占多少字节?

    问题描述 或许你会说一个中文字符占2个字节,这是一定的?如何计算一个字符串的字节数? 解决方案 在oracle中一个字符特别是中文占几个字节是不同的. 比如我创立一个表create table tes ...

  9. 安装ORACLE时在Linux上设置内核参数的含义

    前两天看到一篇Redhat官方的Oracle安装文档,对于Linux内核参数的修改描述的非常清晰. 安装Oracle之前,除了检查操作系统的硬件和软件是否满足安装需要之外,一个重点就是修改内核参数,其 ...

随机推荐

  1. bzoj1635 / P2879 [USACO07JAN]区间统计Tallest Cow

    P2879 [USACO07JAN]区间统计Tallest Cow 差分 对于每个限制$(l,r)$,我们建立一个差分数组$a[i]$ 使$a[l+1]--,a[r]++$,表示$(l,r)$区间内的 ...

  2. java replaceAll之$替换

    最近,在开发一个伪代码翻译工具的过程中,遇到个问题,我们在伪代码中使用spring EL的规则,将非变量限定在${"1"}中,解析后根据上下文的类型转换为相应的java类型.在规则 ...

  3. C++设计模式(第一周)

    part 1 设计模式简介 课程目标 1.理解松耦合设计思想 2.掌握面向对象设计原则 3.掌握重构技法改善设计 4.掌握GOF 核心设计模式 什么是设计模式? “每一个模式描述了一个在我们周围不断重 ...

  4. 20145118 《Java程序设计》 实验报告三

    实验三 敏捷开发与XP实践 实验内容 XP基础 XP核心实践 相关工具 实验要求 1.没有Linux基础的同学建议先学习<Linux基础入门(新版)><Vim编辑器> 课程 2 ...

  5. 《将博客搬至51CTO》

    想把你的博客搬家到51CTO吗?想拥有一键式搬家的体验吗? 就算家大业大不好搬也没关系,我们帮你! 51CTO推出专业的搬家工具,用最短的时间.最快的速度,为你在这儿搭建一个温馨的家. 在这儿,你可以 ...

  6. ACM数论之旅6---数论倒数,又称逆元(我整个人都倒了( ̄﹏ ̄))

    数论倒数,又称逆元(因为我说习惯逆元了,下面我都说逆元) 数论中的倒数是有特别的意义滴 你以为a的倒数在数论中还是1/a吗 (・∀・)哼哼~天真 先来引入求余概念 (a +  b) % p = (a% ...

  7. bzoj 3343: 教主的魔法

    Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 924  Solved: 402[Submit][Status][Discuss] Descriptio ...

  8. sql 题目

    1.自增列 通用: ) from table b where b.sid<a.sid) ,* from table a; ,),* from ... 第二个已经有主键自增列的就不可以用了 还有就 ...

  9. springboot集成shiro 前后端分离

    前后端分离情况下 首先考虑是否跨域,如果没有跨域是可以使用shiro原生的session+cookie,无需特别处理. 如果涉及到跨域则需要考虑cookie问题(本质上也是重写shiro获取JESSI ...

  10. gulp介绍及常用插件

    前端构建工具gulpjs的使用介绍及技巧 gulpjs是一个前端构建工具,与gruntjs相比,gulpjs无需写一大堆繁杂的配置参数,API也非常简单,学习起来很容易,而且gulpjs使用的是nod ...