V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
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 · 2021-12-08 02:17:07 +08:00 · 2142 次点击
    这是一个创建于 1108 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

    第 1 条附言  ·  2021-12-09 00:04:26 +08:00

    感谢大家,@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 条回复    2021-12-08 18:06:44 +08:00
    eason1874
        1
    eason1874  
       2021-12-08 02:32:46 +08:00
    前端传过来的参数你不要直接用,过滤和判断,把 -1 的过滤掉
    ltltfuture
        2
    ltltfuture  
       2021-12-08 02:53:48 +08:00
    看看我这理解的对不对
    比如你要写
    SELECT createTime, billName, billCategory, billAccount
    FROM Bill
    后面加上
    WHERE
    (billCategory <> -1 or billCategory=“你传入的参数” )
    AND
    后面依次加上其他列...
    aragakiyuii
        3
    aragakiyuii  
       2021-12-08 07:21:38 +08:00 via iPhone
    代码里把 -1 过滤掉不就行了…
    thetbw
        4
    thetbw  
       2021-12-08 08:56:29 +08:00
    这部就是 mybatis 的 if 吗
    <if test="billCategory!= null and billCategory!=-1">
    and bill_category = #{billCategory}
    </if>
    dream4ever
        5
    dream4ever  
       2021-12-08 08:59:45 +08:00
    最原始的方式,就是手动拼装 SQL 语句嘛。
    onhao
        6
    onhao  
       2021-12-08 11:26:30 +08:00
    楼主看来是不想在程序里处理, 直接在 mysql 里咯, 那么我这里有一个办法不知楼主敢不敢用!
    https://wuhao.pw/archives/268/
    这方法可能争议很大的 , 用函数来实现,自定义一个函数 来处理这个特定值。^_^
    raptor
        7
    raptor  
       2021-12-08 11:45:10 +08:00
    SELECT createTime, billName, billCategory, billAccount
    FROM Bill
    WHERE
    (:billCategory = -1 or billCategory=:billCategory)

    然后把输入值传给:billCategory 这个参数即可。
    Tenlearn
        8
    Tenlearn  
       2021-12-08 14:07:50 +08:00
    @onhao 敢用,月底就领工资走了,很安详
    2i2Re2PLMaDnghL
        9
    2i2Re2PLMaDnghL  
       2021-12-08 15:35:03 +08:00
    如果传参可以有序参数化的话
    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  
       2021-12-08 18:06:44 +08:00
    你个人像事情逻辑有点问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4822 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:45 · PVG 17:45 · LAX 01:45 · JFK 04:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.