如何在已有的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的语句怎样写?

参考技术A 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())
)
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'
)

本回答被提问者和网友采纳
参考技术B

可以再嵌套一个

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_TicketBasic
left 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会根据传入的条件动态拼接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> </select

2:添加接口

// 遍历数组接口
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>

...

动态SQL使用注意事项

例如:

<!-- 不报错 -->
<when test="age >= 0">
       age > #{sge}
</when>

<!-- 报错 -->
<when test="age >= 0">
       age < #{sge}      “<”   会被误认为是尖括号的开头,所有报错
</when>

解决的第一种方式:实体符号代替的使用

原符号      实体符号
  <         &lt;
  <=        &lt;=
  >         &gt;
  >=        &gt;=
  &         &amp;
  "         &quot;&apos;

解决的第二种方式: CDATA

可以将特殊的符号放在 < ! [ CDATA[ ] ]>中

    <if test="age>=0">
        AND age <![CDATA[ <  ]]> #{age}
    </if>

 ...

 本笔记参考自:小猴子老师教程 http://www.monkey1024.com

以上是关于如何在已有的SQL查询的语句中,再添加一个查询条件?的主要内容,如果未能解决你的问题,请参考以下文章

SQL查询语句中,为啥在WHERE后面查询条件有的要加单引号,有的不用加,啥时候加,啥时候不加?

sql怎么添加自定义列并且将此列的数据作为条件查询

mybatis_动态SQL

SQL语句对返回的结果集里的字段再进行条件查询,在一个结果集显示

ORACLE模糊查询语句 当条件为 like %(% 或者like %)%时 结果为全查吗

mssql 如何在已有的表中 添加多个列名?