› MySQL 5.5 Community Server
› MySQL 5.6 Community Server
› Percona Configuration Wizard
› XtraBackup 搭建主从复制
Great Sites on MySQL
› Percona
› MySQL Performance Blog
› Severalnines
推荐管理工具
› Sequel Pro
› phpMyAdmin
推荐书目
› MySQL Cookbook
MySQL 相关项目
› MariaDB
› Drizzle
参考文档
› http://mysql-python.sourceforge.net/MySQLdb.html
lixyz
V2EX  ›  MySQL

MySQL 查询,能否做到当某字段为特定值时,该条件字段不起作用

  •  
  •   lixyz · Dec 8, 2021 · 2926 views
    This topic created in 1756 days ago, the information mentioned may be changed or developed.

    标题描述的不太清楚,我举个例子:

    数据库 Bill 有如下字段 createTime:创建时间 billName:账单名称 billCategory:账单分类 billAccount:账单账户 等等

    然后前端通过下拉菜单会有如下筛选: 开始时间,结束时间,账单分类,账单账户,等等

    如果前段对每个条件都设置值的话,后台数据库查询很容易

    但假如说 [账单分类] 前台并没有通过下拉菜单进行选择,而是选择了默认,会向后台传递一个 -1 值

    这个时候后台的查询语句该怎么写啊

    因为条件字段有若干个,如果不选择的话都会返回一个默认特定值,但条件有挺多的,会有若干个组合,所以就想请问,MYSQL 有没有类似的语句,就是当 where 种某个条件等于某个值时,这个条件就不起作用 -_-|||

    我目前想到的方法是先在后台把所有的数据全查出来,然后再根据传递过来的数据筛选,但好像这个方法有点笨

    一直写 android ,完全是赶鸭子上架,求大佬

    Supplement 1  ·  Dec 9, 2021

    感谢大家,@thetbw 大佬说的没错儿,就是 mybatis 中的 if,已经搞定,赶鸭子上架,匆忙学了点儿就写了,见笑了

        @Select({"<script>",
                "SELECT * FROM Test" +
                        " WHERE 1=1" +
                        " <when test='a!=-1'>" +
                        " AND a = #{a}" +
                        " </when>" +
                        " <when test='b!=-1'>" +
                        " AND b = #{b}" +
                        " </when>" +
                        " <when test='c!=-1'>" +
                        " And c = #{c}" +
                        " </when>" +
                        " </script>"})
        ArrayList<TTT> testMySQL(@Param("a") String a, @Param("b") String b, @Param("c") String c);
    
    10 replies  •  2021-12-08 18:06:44 +08:00
    eason1874
        1
    eason1874  
       Dec 8, 2021
    前端传过来的参数你不要直接用,过滤和判断,把 -1 的过滤掉
    ltltfuture
        2
    ltltfuture  
       Dec 8, 2021
    看看我这理解的对不对
    比如你要写
    SELECT createTime, billName, billCategory, billAccount
    FROM Bill
    后面加上
    WHERE
    (billCategory <> -1 or billCategory=“你传入的参数” )
    AND
    后面依次加上其他列...
    aragakiyuii
        3
    aragakiyuii  
       Dec 8, 2021 via iPhone
    代码里把 -1 过滤掉不就行了…
    thetbw
        4
    thetbw  
       Dec 8, 2021
    这部就是 mybatis 的 if 吗
    <if test="billCategory!= null and billCategory!=-1">
    and bill_category = #{billCategory}
    </if>
    dream4ever
        5
    dream4ever  
       Dec 8, 2021
    最原始的方式,就是手动拼装 SQL 语句嘛。
    onhao
        6
    onhao  
       Dec 8, 2021
    楼主看来是不想在程序里处理, 直接在 mysql 里咯, 那么我这里有一个办法不知楼主敢不敢用!
    https://wuhao.pw/archives/268/
    这方法可能争议很大的 , 用函数来实现,自定义一个函数 来处理这个特定值。^_^
    raptor
        7
    raptor  
       Dec 8, 2021
    SELECT createTime, billName, billCategory, billAccount
    FROM Bill
    WHERE
    (:billCategory = -1 or billCategory=:billCategory)

    然后把输入值传给:billCategory 这个参数即可。
    Tenlearn
        8
    Tenlearn  
       Dec 8, 2021
    @onhao 敢用,月底就领工资走了,很安详
    2i2Re2PLMaDnghL
        9
    2i2Re2PLMaDnghL  
       Dec 8, 2021
    如果传参可以有序参数化的话
    WHERE ?1<>-1 OR billCategory=?1
    如果不能的话
    WHERE ?<>-1 OR billCategory=? 并且把这个参数传两遍,就会变成 query(sql, a, a, b, b, c, c, d, d) 这样的结构(你也可以再封装一下)
    对于恒 true 或者恒 false 的条件,SQL 会在编译期直接优化掉。
    gesse
        10
    gesse  
       Dec 8, 2021
    你个人像事情逻辑有点问题
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2875 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 12:19 · PVG 20:19 · LAX 05:19 · JFK 08:19
    ♥ Do have faith in what you're doing.