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

例如

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. 干货:Java多线程详解(内附源码)

      线程是程序执行的最小单元,多线程是指程序同一时间可以有多个执行单元运行(这个与你的CPU核心有关). 在java中开启一个新线程非常简单,创建一个Thread对象,然后调用它的start方法,一个 ...

  2. 20145331魏澍琛《网络对抗》Exp6 信息搜集与漏洞扫描

    20145331魏澍琛<网络对抗>Exp6 信息搜集与漏洞扫描 问题回答 1.哪些组织负责DNS,IP的管理? DNS域名服务器:绝大多数在欧洲和北美洲,中国仅拥有镜像服务器. 全球一共有 ...

  3. VC++ 利用CreateFile、ReadFile和WriteFile实现CopyFile

    1. CreateFile:这是一个多功能的函数,可打开或创建以下对象,并返回可访问的句柄:控制台,通信资源,目录(只读打开),磁盘驱动器,文件,邮槽,管道. 参照:http://www.cppblo ...

  4. TCP 的连接建立:采用三报文握手

  5. Python3基础 tuple 通过拆分元组向元组中加入新的元素

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  6. Python3基础 str for 输出字符串中的每个字符

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. Django组件(一) Django之分页器

    Django的分页器(paginator)简介 在页面显示分页数据,需要用到Django分页器组件 from django.core.paginator import Paginator Pagina ...

  8. BIOS、MBR、UEFI和GPT关系

    很多用户在新买电脑,或是给已有电脑重装系统时都出现过怎么都无法引导U盘安装的情况.究其原因,还是没能搞清楚BIOS.MBR.UEFI和GPT的复杂关系.所以,今天小编就和大家分享一下它们之间的爱恨情仇 ...

  9. Wannafly14挑战赛 C(tarjan缩点)题解

    题目:牛客题目链接 思路:这道题有点像这道题 先缩点,缩完之后判断一下整个强连通分量入度是不是0,如果是的话向ans压入该强连通分量最小的那个值.最后排序一下ans输出就行了. 思路一下就想到了,就是 ...

  10. mybatis 问题

    applicationContext.xml报错https://bbs.csdn.net/topics/392184546MyBatis SqlSessionFactory的几种常见创建方式https ...