mysql应该如何在where语句中添加if语句进行条件判断?where if 语句应该如何使用
- 发表于:2022-08-10 16:16
- 阅读(4597)
(1) where if 语句
1、如果我们是根据传入的变量来动态添加where查询条件,那我们完全可以使用mybatis的 <if></if> 来实现,如下:
<where>
<if test="type != null and type != ''">
and type = #{type}
</if>
</where>
但是如果我们是要根据每条记录本身的某个字段值来动态添加where查询条件,那就无法使用上面的 if 标签实现了,需要使用 mysql 的 where if 语句。
2、where if语句语法:
-- where if语句的语法如下:
where if(判断条件, true执行条件, false执行条件)
也就是这个格式:IF(<condition>,<value if true>,<value if false>)
如果condition为true,则执行前面的条件;condition为false,则执行后面的条件。
if 语句主要接收三个参数,第一个参数是判断条件,第二个参数是如果第一个参数的判断条件返回true的时候执行的语句,第三个参数是如果第一个参数的判断条件返回false的时候执行的语句。其实和Java中使用的三母运算符挺相似的。
(2)简单示例
例如:我们经常会遇到数据权限的问题,需要根据文章的可见性类型判断是否需要显示该文章,由于文章的可见性类型是文章表上的字段,并且每个文章记录都存储了不一样的值,因此我们需要使用where if语句来对每条文章记录判断可见性类型,再作出不同的判断。
-- 查询出所有文章列表,并且根据文章的可见性类型,判断当前登录的用户是否在其可见范围内,如果是则返回该文章,如果不是则忽略该文章(如果可见性类型是0,表示全部可见;如果可见性类型是1,表示部分用户可见)
-- 实现SQL语句如下:
-- 我使用的是spring-data-jpa,这里的:userId是传入的当前登录的用户ID,这句SQL表示,查出所有文章,如果文章设置了全部可见类型,则返回,如果设置了自定义用户可见,则需要判断当前用户ID是否在可见用户ID列表中,如果是则查出该文章,否则不查出该文章;
select b.* from blog where b.enabled=1 and if(b.visible_type = 1, if(find_in_set(:userId, p.visible_user_ids), 1=1, 1<>1), 1=1);
或者:
select b.* from blog where b.enabled=1 and if(b.visible_type = 1, if(find_in_set(:userId, p.visible_user_ids), true, false), true);
sql中的1=1其实就是在where拼接 and 1=1,1=1返回的结果是true,也就是相当于下面的 and true,表示需要查出该记录,如果是 and 1<>1 或者是 and false,则表示不要查出该记录。
总结:这个 where if 语句在复杂的业务场景下还是普遍需要用到的,mysql还有好多需要学习的,我们最好还是项目驱动学习,END!
参考:
mysql查询语句where后面加if判断
where if条件查询
mysql查询语句where后面加if判断
MySQL 的if条件判断和where相关条件查询
mysql where后面if_mysql查询语句where后面加if判断
mysql where条件里面加if判断
mysql查询语句where后面加if判断
sql where后面添加多个if判断
mysql中where+if判断
Mysql中where 条件中加 if 判断-纯jdbc
其他 - MySQL中“ WHERE TRUE”的用法是什么
相关推荐
-
mac安装subversion,并使用svn命令检出服务器上的代码库项目
mac安装svn只要通过Homebrew安装即可,不需要下载额外的安装包手动安装,Homebrew类似一个软件库,我们可以通过brew命令实现一键下载并安装我们所需要的常用软件。
-
Java如何获取泛型类T的Class
我们平时在封装接口或抽象类的时候经常会用到Java的泛型,经常会在传入一个泛型类T,然后封装一些抽象的方法,泛型的好处就是在编译的时候检查类型安全,并且所有的强制类型转换都是隐式和自动的,这样可以提高代码的通用性。但是我们有时候需要获取泛型类的Class,那可以如何获取到呢?
-
springboot项目事务报错:Transaction synchronization is not active
这几天在使用spring声明式事务的时候突然报了一个错误:Transaction synchronization is not active,之前使用的都是好好的,为什么这次就不行了呢?不就是加一个 @Transactional 而已嘛???
-
mysql应该如何在where语句中添加if语句进行条件判断?where if 语句应该如何使用
我们在平时的项目开发中,有时候会遇到复杂一点的需求,需要我们手动编写复杂的SQL语句,并且有时候需要根据每条表记录的实际情况进行判断,根据每条记录动态添加不同的where条件,这个时候我们就可以在where语句中使用if语句进行条件判断,那么where if应该如何正确使用呢?
-
关于websocket多节点分布式问题的解决方案
websocket是一种在单个TCP连接上进行双全工通信的协议,使用websocket,我们可以实现服务端主动向各个订阅消息通道的客户端推送消息。这点比传统的http轮询请求要更好一点,避免一些无用的请求,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
-
mac如何把文件压缩成tar、zip以及如何解压tar、zip?
有时候我们需要把文件压缩成一个tar文件或zip文件,发送给别人,那么在macos系统应该如何压缩和解压缩呢?
-
openjdk和jdk有什么区别,应该如何选择?
我们一开始学习java的时候,安装的都是从sun官网或oracle官网下载的jdk安装包,但其实还有另外一个来源可以获取到jdk安装包,那就是openjdk,它和jdk基本一样,推荐使用openjdk。
-
如果git仓库发生变更,IDEA如何直接修改git远程仓库地址?
有时候我们整理远程仓库代码的时候,会修改远程仓库的名称,或者所属分组,这个时候在IDEA由于还是使用原先拉取的旧仓库地址,导致本地代码会提交不了,也更新不了远程最新代码,那么这个时候要如何修改IDEA当前的git远程仓库地址呢?如何无缝修改,修改完之后就能和原来一样更新提交,并且以前的提交记录也保留呢?
-
微信公众号自定义菜单报错:no permission to use weapp in menu rid:xxxxxxx
昨晚公司系统添加微信公众号菜单突然报错:{"errcode":45064,"errmsg":"no permission to use weapp in menu rid: 60311f70-0736ff08-29143906"}
-
Java如何使用stream流对List列表数据进行自定义排序
我们一般做排序功能都是通过在mysql数据库中的表中定义好排序字段,然后使用升序或降序来进行排序,复杂一点的话就配合多个排序字段进行排序,但是如果碰到那种无法使用表的字段进行排序的情况,我们需要先从数据库中取出列表数据,然后再通过业务代码对列表进行排序,这个时候我们就可以使用redis或Java的stream流。
-
微信企业付款到零钱报错:此请求可能存在风险,已被微信拦截
具体错误信息:com.github.binarywang.wxpay.exception.WxPayException: 返回代码:[SUCCESS],返回信息:[支付失败],结果代码:[FAIL],错误代码:[NO_AUTH],错误详情:[此请求可能存在风险,已被微信拦截。]
-
springboot项目使用@Transactional注解如何避免长事务问题
在springboot项目中,我们开启事务是非常简单的,使用注解的方式就是在需要开启事务的方法上添加@Transactional,这样就可以实现这个方法里面的所有操作和调用方法的操作都绑定在一个事务上面,要么全部一起执行成功,要么全部一起执行失败,如果其中有某个地方抛了异常,则整个方法涉及的事务操作都会回滚,但是如果随意滥用@Transactional,又有可能引发长事务问题,导致数据库死锁、数据库连接池占满等问题。
-
css实现“展开阅读全文”功能
最近发现很多博客网站,资讯网站喜欢把资讯博文,内容等这些大文本的信息在页面显示的时候都会有个“展开阅读全文”的按钮,点击这个按钮即可展开显示所有的内容,不然一开始就显示那么长的篇幅相对来说既不美观,又对用户体验不好。现在就让我来仿照这类网站实现一个“展开阅读全文”功能。这里主要用到的前端技术是html+jquery+css,只做展开功能,没做收起功能(收起功能没必要吧,谁会去收起呀???)。
-
关于编程中面向对象的理解,什么是面向对象
面向对象设计相对于结构化程序设计可以说是一种更优秀的程序设计方法。它的基本思想是使用类、对象、继承、封装、消息等基本概念进行程序设计。它是从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在软件系统构造中尽可能运用人类的自然思维方式,强调直接以现实世界中的事物(即对象)为中心来思考,认识问题。
-
我的linux操作命令总结,记录常用linux操作命令
平常本地开发项目使用的系统基本都是window系统,而且都是图形化操作,非常方便,window也是越做越好了,项目部署到生产环境一般都是选择linux系统(当然window server系列也可以),而linux一般则选择centOS居多,这里记录一下linux常用命令,以免老是过几天就忘了,后续不断补充。