<!-- 一址多证纳税人分析表 -->
<select id="yzdznsrlistPage" parameterType="page" resultType="pd">
select * from (
select null NSRSBH,null NSRMC,null ZGSWJ_DM,null ZGSWSKFJ_DM,null SSGLY_DM,null FDDBRXM,null SCJYDZ,null ZCDZ
from dual
<if test="pd.flag==1 or pd.flag==2 or pd.flag==3">
union all            <!-- 此处应该使用union all 而不是union,使用union的话会导致查出的数据量不对 -->
</if>
<if test="pd.flag==1 or pd.flag==3">
select NSRSBH,NSRMC,ZGSWJ_DM,ZGSWSKFJ_DM,SSGLY_DM,FDDBRXM,SCJYDZ,ZCDZ
from hx_dj.dj_nsrxx nsr
where nsr.zcdz in (select n.zcdz from (select ns.zcdz,count(1) cnt from hx_dj.dj_nsrxx ns group by ns.zcdz
having count(1) > 1) n)
<if test="pd.swjg != null and pd.swjg != ''">
AND
<foreach collection="pd.swjgs" item="item" open="(" separator="OR" close=")">
nsr.ZGSWSKFJ_DM LIKE '${item}%'
</foreach>
</if>
</if>
<if test="pd.flag==3">
union
</if>
<if test="pd.flag==2 or pd.flag==3">
select NSRSBH,NSRMC,ZGSWJ_DM,ZGSWSKFJ_DM,SSGLY_DM,FDDBRXM,SCJYDZ,ZCDZ
from hx_dj.dj_nsrxx nsrscjy
where nsrscjy.scjydz in (select nscjy.scjydz from (select nsscjy.scjydz,count(1) cnt from hx_dj.dj_nsrxx nsscjy group by nsscjy.scjydz
having count(1) > 1) nscjy)
<if test="pd.swjg != null and pd.swjg != ''">
AND
<foreach collection="pd.swjgs" item="item" open="(" separator="OR" close=")">
nsrscjy.ZGSWSKFJ_DM LIKE '${item}%'
</foreach>
</if>
</if>
) where NSRSBH is not null
</select>

针对本问题有了新的解决方式,上面的解决方法太过复杂。

其实要判断两个select查询语句是否合并,没必要判断union是否需要存在。让union一直保持存在就好,比如传1进来,可以让上面的select查出值,下面的select查出的是null;传2进来,可以让下面的select查出值,上面的select查出的是null。这样就没必要传

3进来了。多增加一列z,字段的值就是1、2,这样来决定两个查询语句是否查出来的值是null。

上面的语句可以改为

select NSRSBH,NSRMC,ZGSWJ_DM,ZGSWSKFJ_DM,SSGLY_DM,FDDBRXM,SCJYDZ,ZCDZ,1 z
from hx_dj.dj_nsrxx nsr
where nsr.zcdz in (select n.zcdz from (select ns.zcdz,count(1) cnt from hx_dj.dj_nsrxx ns group by ns.zcdz
having count(1) > 1) n) 
<if test="pd.swjg != null and pd.swjg != ''">
AND 
<foreach collection="pd.swjgs" item="item" open="(" separator="OR" close=")">
nsr.ZGSWSKFJ_DM LIKE '${item}%' 
</foreach>
</if> and z = '1'

union

select NSRSBH,NSRMC,ZGSWJ_DM,ZGSWSKFJ_DM,SSGLY_DM,FDDBRXM,SCJYDZ,ZCDZ,2 z
from hx_dj.dj_nsrxx nsrscjy
where nsrscjy.scjydz in (select nscjy.scjydz from (select nsscjy.scjydz,count(1) cnt from hx_dj.dj_nsrxx nsscjy group by nsscjy.scjydz
having count(1) > 1) nscjy)
<if test="pd.swjg != null and pd.swjg != ''">
AND 
<foreach collection="pd.swjgs" item="item" open="(" separator="OR" close=")">
nsrscjy.ZGSWSKFJ_DM LIKE '${item}%' 
</foreach>
</if> and z = '2'

mybatis中union可以用if判断连接,但是<select>中第一个select语句不能被if判断,因此可以从dual表中查询null来凑齐。union如果使用order by排序,那么只能放在最后一个查询语句的位置,并且不能带表名。的更多相关文章

  1. iphone下元素放在了一个position: fixed的div中无法点击

    网上的说法是这样的: iphone的浏览器有这么一个bug, 当你使用锚定或滚动页面后, 你会发现某些东西不能点击了! 如果你的这个“东西”放在了一个position: fixed的div中, 那么你 ...

  2. 第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all; Select 列 into 新表;字符串函数;日期函数

    第17课-数据库开发及ado.net 聚合函数,模糊查询like,通配符.空值处理.order by排序.分组group by-having.类型转换-cast,Convert.union all;  ...

  3. 关于实现mybatis order by 排序传递参数实现 问题记录

    一    问题场景:本人项目纯纯的后端系统  并且项目前端采用纯纯的原生js 实现 1)表格  通过查询列表数据放入到域中  前段采用 for循环的方式实现遍历生成列表 2)分页实现本人是公司内部自定 ...

  4. union 时只能查出一个表中的信息,另一个表只能查出字段

    原因:news表中title字段的编码,与brand表中的编码不一致导致 y

  5. SQL Server数据库--》top关键字,order by排序,distinct去除重复记录,sql聚合函数,模糊查询,通配符,空值处理。。。。

    top关键字:写在select后面 字段的前面 比如你要显示查询的前5条记录,如下所示: select top 5 * from Student 一般情况下,top是和order by连用的 orde ...

  6. 玩得一手好注入之order by排序篇

    看了之前Gr36_前辈在先知上的议题,其中有提到排序注入,这个在最近经常遇到这样的问题,所以先总结下order by 排序注入的知识. 0×00 背景 看了之前Gr36_前辈在先知上的议题,其中有提到 ...

  7. 详解MySQL中concat函数的用法(连接字符串)

    MySQL中concat函数 使用方法: CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意: 如果所有参数均为非二进制 ...

  8. oracle order by 排序

    Syntax ORDER BY { column-Name | ColumnPosition | Expression } [ ASC | DESC ] [ NULLS FIRST | NULLS L ...

  9. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

随机推荐

  1. Python traceback的优雅处理

    刚接触Python的时候,简单的异常处理已经可以帮助我们解决大多数问题,但是随着逐渐地深入,我们会发现有很多情况下简单的异常处理已经无法解决问题了,如下代码,单纯的打印异常所能提供的信息会非常有限. ...

  2. 二进制补码除法——计算机底层整数除法模拟之Java实现

    前面讲到布思算法的计算机底层模拟的时候,我们是借助于一个可以储存.表示任意N位的二进制补码的BinaryQueue实现的,现在我们模拟计算机底层整数除法还是要借助于它: BinaryQueue类代码: ...

  3. Confluence 6 管理协同编辑

    协同编辑能够让项目小组中的协同合作达到下一个高度.这个页面对相关协同编辑中的问题进行了讨论,能够提供给你所有希望了解的内容. 进入 Collaborative editing 页面来获得项目小组是如何 ...

  4. Spark-SQL之DataFrame操作

    Spark SQL中的DataFrame类似于一张关系型数据表.在关系型数据库中对单表或进行的查询操作,在DataFrame中都可以通过调用其API接口来实现.可以参考,Scala提供的DataFra ...

  5. easyUI详解

    1.EasyUI 是前端框架,封装大量 css和封装大量 JS 2.使用前端框架时,给标签定义class 属性,就会有样式和脚本功能了 3.data-options 属性是定义 easyui 属性的, ...

  6. noip 2018.10.14 模拟赛 砍树

    数学问题... 根据题意,有: 移项,整理,得: 记 于是 那么 可以看到,最多只会有2*个取值(显而易见) 于是对应的,可能产生效果的d也只会有个,于是我们把他们找出来,扔进一个数组里然后排序,去重 ...

  7. Happiness

    1575: Happiness 时间限制: 1 Sec  内存限制: 1280 MB 题目描述 Chicken brother is very happy today, because he atta ...

  8. 性能测试四十六:Linux 从网卡模拟延时和丢包的实现

    Linux 中模拟延时和丢包的实现 使用ifconfig命令查看网卡 Linux 中使用 tc 进行流量管理.具体命令的使用参考 tc 的 man 手册,这里简单记录一下使用 tc 模拟延时和丢包的命 ...

  9. Python使用正则表达式分割字符串

    re.split(pattern, string, [maxsplit], [flags]) pattern:表示模式字符串,由要匹配的正则表达式转换而来. string:表示要匹配的字符串. max ...

  10. swagger2访问url

    swagger : http://localhost:8080/swagger/index.html springboot中的swagger:http://localhost:8080/swagger ...