如何在已有的SQL查询的语句中,再添加一个查询条件?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在已有的SQL查询的语句中,再添加一个查询条件?相关的知识,希望对你有一定的参考价值。
两个表,一个表是TBL_TicketBasic,里面存储了票号、票据时间、票据状态等信息;另一个表是TBL_TicketType,里面只有票据类型,票据类型分为客票和货票两种
现在已有一个SQL查询语句实现了查询客票超期6个月,货票超期3个月的所有的票据信息(超期就是从票据时间开始)语句如下:
select * from
(select a.*, b.TicketTypeKind from TBL_TicketBasic as a
left join
TBL_TicketType as b on a.TicketType = b.TicketTypeNo)as c
where (c.TicketTypeKind = '2' and c.InDatetime<dateadd(month,-3,getdate()))
or (c.TicketTypeKind = '1' and c.InDatetime<dateadd(month,-6,getdate()))
我要再添加一个条件,就是在以上的基础上,进一步筛选出票据状态为“未销号”的,请高手帮忙写出语句,谢谢,分数不够可追加
上面没说清楚,票据状态有很多,没有直接的“未销号”,S表示已经销号,排除S的语句怎样写?
(
select a.*, b.TicketTypeKind from TBL_TicketBasic as a
left join
TBL_TicketType as b on a.TicketType = b.TicketTypeNo
)as c
where
(
(c.TicketTypeKind = '2' and c.InDatetime<dateadd(month,-3,getdate()))
or (c.TicketTypeKind = '1' and c.InDatetime<dateadd(month,-6,getdate())
)
and c.票据状态 = ‘未销号’
)追问
可能没描述清楚,S表示已经销号。。。排除S的语句怎么写?。。。
追答是不要 已经销号 ,还是要 已经销号 的
下面假设不用 已销号的:
select * from
(
select a.*, b.TicketTypeKind from TBL_TicketBasic as a
left join
TBL_TicketType as b on a.TicketType = b.TicketTypeNo
)as c
where
(
(c.TicketTypeKind = '2' and c.InDatetime ‘S'
)
可以再嵌套一个
select *from
(
select *
from
(
select a.*, b.TicketTypeKind
from TBL_TicketBasic as a
left join TBL_TicketType as b on a.TicketType = b.TicketTypeNo
)as c
where (c.TicketTypeKind = '2' and c.InDatetime<dateadd(month,-3,getdate()))
or (c.TicketTypeKind = '1' and c.InDatetime<dateadd(month,-6,getdate()))
)d
where d.TicketStatus not like '%S%'
----再或者用inner join 关联下
select *
from
(
select a.*, b.TicketTypeKind
from TBL_TicketBasic as a
left join TBL_TicketType as b on a.TicketType = b.TicketTypeNo
)as c
inner join (select * from TBL_TicketBasic(不确定状态字段在哪个表) where TicketStatus='未销号') e on a.TicketType=e.TicketType
where (c.TicketTypeKind = '2' and c.InDatetime<dateadd(month,-3,getdate()))
or (c.TicketTypeKind = '1' and c.InDatetime<dateadd(month,-6,getdate()))追问
第二个方法查了以后有错误,第一个倒是没错误可是什么也查不到啊。。。我确定我的数据库表里有数据的,奇怪了我也想这样写的,可是就是有问题
追答我不知道你状态的哪个字段是什么 在哪个表的 ?
参考技术C select * from TBL_TicketBasicleft join TBL_TicketType
on TBL_TicketType.id=TBL_TicketBasic.id ---希望表里有对应ID
where 票据时间>6 and id=客票 and 票据状态=未销号
union
select * from TBL_TicketBasic
left join TBL_TicketType
on TBL_TicketType.id=TBL_TicketBasic.id ---希望表里有对应ID
where 票据时间<3 and id=货票and 票据状态=未销号 参考技术D 把前面的两个or条件再用括号括起来,然后后面加and 条件就行了啊 第5个回答 2013-07-24 在你的基础上加上
where 票据状态=‘未销号’
mybatis_动态SQL
在实际的开发过程中,再查询的过程中有时可能会有多个条件,有时查询的条件个数可能时一个,用户再添加查询信息时,查询条件的个数是不一定的,所以可以利用动态SQL来解决该问题,动态SQL会根据传入的条件动态拼接SQL语句
if 标签
用该标签来判断用户是否输入某个条件,或用户输入是否符合查询条件
1:再StudentMapper.xml文件中编写以下内容
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.doaoao.dao.StudentDao"> <select id="selectIf" resultType="student"> SELECT id,name,age,score FROM t_student WHERE 1 = 1 <if test="name != null and name != ‘‘"> AND name like ‘%‘ #{name} ‘%‘ </if> <if test="age > 0"> AND age > #{age} </if> </select> </mapper># 注:上方添加 where 1 = 1 的目的是,当用户未输入name和age两个条件是,不至于让where的条件为空,为空的话SQL语句就不正确
2:在StudentDao中添加接口(接口名称与select中的属性id名称相同)
package com.doaoao.dao; import com.doaoao.bean.Student; import java.util.List; public interface StudentDao { List<Student> selectIf(Student student); }3:在测试类中进行测试
package com.doaoao.test; import com.doaoao.bean.Student; import com.doaoao.dao.StudentDao; import com.doaoao.util.MyBatisUtil; import org.apache.ibatis.session.SqlSession; import org.junit.After; import org.junit.Before; import org.junit.Test; import java.util.List; public class StudentTest01 { private StudentDao studentDao; private SqlSession sqlSession; // 执行测试方法之前会执行该方法 @Before public void init(){ sqlSession = MyBatisUtil.getSqlSession(); studentDao = sqlSession.getMapper(StudentDao.class); } // 方法执行完成后需要关闭sqlSession @After public void closeSession(){ if(sqlSession != null){ sqlSession.close(); } } @Test public void selectIf(){ Student student = new Student("liu",0,0); List<Student> students = studentDao.selectIf(student); System.out.println(students); } }where 标签
where标签的作用与上方 " where 1 = 1 " 具有相同的作用
1:编写StudentMapper.xml中的内容
<select id="selectWhere" resultType="student"> SELECT id,name,age,score FROM t_student <where> <if test="name != null and name != ‘‘"> AND name like ‘%‘ #{name} ‘%‘ </if> <if test="age > 0"> AND age > #{age} </if> </where> </select>2:添加接口
List<Student> selectWhere(Student student);3:添加测试类
@Test public void selectWhere(){ Student student = new Student("liu",0,0); List<Student> students = studentDao.selectIf(student); System.out.println(students); }choose 标签
该标签的作用就是,若 name 不为空,就利用name进行查询,若name为空,则利用 age 进行查询;若age也为空可利用默认的进行查询
1:编写StudentMapper.xml中的内容
<select id="selectChoose" resultType="student"> SELECT id,name,age,score FROM t_student <where> <choose> <when test="name != null and name != ‘‘"> name like ‘%‘ #{name} ‘%‘ </when> <when test="age >= 0"> age > #{sge} </when> </choose> </where> </select>2:添加接口
List<Student> selectChoose(Student student);3:编写测试类
@Test public void selectChoose(){ Student student = new Student("liu",0,0); List<Student> students = studentDao.selectIf(student); System.out.println(students); }foreach标签
当用户想要查询 1,3,5,7,9这几条数据时,在sql语句中我们可以用以下方式实现
select id,name,age from t_student where id in(1,3,5,7,9)在mybatis中我们可以使用foreact来实现
1:修改StudentMapper.xml中的内容
<!-- 遍历数组 --> <select id="selectForeachArray" resultType="student"> SELECT id,name,age,score FROM t_student <if test="array != null and array.length > 0"> WHERE id in <foreach collection="array" open="(" close=")" item="id" separator=","> #{id} </foreach> </if> </select>
<!-- 遍历集合 --> <select id="selectForeachList" resultType="student"> SELECT id,name,age,score FROM t_student <if test="list != null and list.length > 0"> WHERE id in <foreach collection="list" open="(" close=")" item="id" separator=","> #{id} </foreach> </if> </select2:添加接口
// 遍历数组接口 List<Student> selectForeachArray(Object[] ids); // 遍历集合接口 List<Student> selectForeachList(Object[] ids);3:编写测试类
// 数组测试类 @Test public void selectForeachArray(){ Object[] ids = new Object[]{1,3,5,7,9}; List<Student> students = studentDao.selectForeachArray(ids); System.out.print(students) }
// 集合测试类 @Test public void selectForeachList(){ List<Integer> list = new ArrayList<>(); list.add(5); list.add(6); list.add(10); list.add(15); List<Student> students = studentDao.selectForeachList(list); System.out.print(students) }sql 标签
该标签用来定义一个可被复用的sql片段
1:在mapper中配置并使用该标签
<!-- 定义该标签 -->
<sql id="selectSql"> SELECT id,name,age,score FROM t_student </sql>
<select id="selectForeach" resultType="student">
<!-- 使用该标签 -->
<include refid="selectSql"> <if test="array != null and array.length > 0"> WHERE id in <foreach collection="array" open="(" close=")" item="id" separator=","> #{id} </foreach> </if> </select>...
例如:
<!-- 不报错 --> <when test="age >= 0"> age > #{sge} </when> <!-- 报错 --> <when test="age >= 0"> age < #{sge} “<” 会被误认为是尖括号的开头,所有报错 </when>解决的第一种方式:实体符号代替的使用
原符号 实体符号 < < <= <= > > >= >= & & " " ‘ '解决的第二种方式: CDATA
可以将特殊的符号放在 < ! [ CDATA[ ] ]>中
<if test="age>=0"> AND age <![CDATA[ < ]]> #{age} </if>...
本笔记参考自:小猴子老师教程 http://www.monkey1024.com