MySQL查询语句WHERE后面IF判断及应用

MySQL查询语句WHERE后面IF判断及应用

最近发现where后面还能跟if,前面mysql算是白学了。
WHERE IF(expression ,expr_true, expr_false);
MySQL的IF()函数,接受三个表达式,如果第一个表达式为true,而不是零且不为NULL,它将返回第二个表达式。否则,它返回第三个表达式。根据使用它的上下文,它返回数字或字符串值。
没错,跟java的三元表达式如出一辙

IF的使用

假如现需要 返回id大于3的王2,id小于等于3的王3
在这里插入图片描述
SQL语句可以这样写

SELECT * FROM users WHERE IF(id > 3, name = '王2', name = '王3');

返回结果
在这里插入图片描述
再比如现需要 返回id大于3的王2,id小于等于3的全部
SQL语句可以改为

SELECT * FROM users WHERE IF(id > 3, name = '王2', true);

运行结果
在这里插入图片描述
ps:下面是我项目中出现的一些问题,感兴趣的可以了解一下。我使用的go语言的gorm包演示,sql是一样的,都可以看

需求复现

后端接收筛选数据,需要判断哪些字段为空,从而更改查询结果。
最容易想到的,也是最暴力的就是在接收数据时,写一堆if语句,判断哪些为空,从而调用哪些sql语句。
但这样有一个很明显的问题,就是if条件会非常的多,mysql语句也需要写很多,代码十分的冗余。
比如我现在定义一个结构体

// ParamScreen 筛选参数
type ParamScreen struct {
	Gender string `json:"gender"`
	State  uint64 `json:"state"`
	Name   string `json:"name"`
}

这是关于State字段的一些需求,这里还是没有考虑Gender、和Name字段

筛选结果
默认全部已报名1
已宣讲2 已面试3 已录取4
待宣讲5(正处于1) 待面试6(正处于2) 待录取7(正处于3)

State字段在数据库中对应数据为

0已注册 1已报名 2已宣讲 3已面试 4已录取

所以上面的筛选结果在不考虑State、Gender、Name是否为空的情况下可以分为两部分

State <= 4时: state查询条件为 state>=
State > 4时: state查询条件为 state =

另外需要判断各字段是否为空,共有3×2×2种组合,但是通过IF可以简化为下面两种

// ScreenStudents 筛选学生
func ScreenStudents(per *models.ParamScreen) ([]*models.Student, error) {
	/*筛选结果
	默认全部已报名1
	已宣讲2 已面试3 已通知4
	待宣讲5(正处于1)    待面试6(正处于2) 待通知7(正处于3)
	*/
	var data []*models.Student
	var err error
	if per.State <= 4 {
		err = DB.Where("IF (? = '',true,gender = ?) AND IF (? = '',true,state >= ?) AND IF (? = '',true,name like ?)", per.Gender, per.Gender, per.State, per.State, per.Name, "%"+per.Name+"%").Find(&data).Error
	} else {
		err = DB.Where("IF (? = '',true,gender = ?) AND IF (? = '',true,state = ?) AND IF (? = '',true,name like \"%?%\")", per.Gender, per.Gender, per.State, per.State, per.Name, "%"+per.Name+"%").Find(&data).Error
	}
	return data, err
}

真的是,太好用了!


上面把问题搞复杂了!!!
因为where 字段 like '%%' 就会查找该字段的所有值,不需要判断是否为空,比如上面的例子可以写成

// ScreenStudents 筛选学生
func ScreenStudents(per *models.ParamScreen) ([]*models.Student, error) {
	/*筛选结果
	默认全部已报名1
	已宣讲2 已面试3 已通知4
	待宣讲5(正处于1)    待面试6(正处于2) 待通知7(正处于3)
	*/
	var data []*models.Student
	var err error
	if per.State <= 4 {
		err = DB.Where("gender = ? AND state >= ? AND  name like ?", per.Gender,  per.State,  "%"+per.Name+"%").Find(&data).Error
	} else {
		err = DB.Where("gender = ? AND state = ? AND name like ?",per.Gender,  per.State, "%"+per.Name+"%").Find(&data).Error
	}
	return data, err
}
  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: MySQL中的WHERE IF语句用于在WHERE子句中使用条件语句。它允许您根据条件选择要返回的行。例如,您可以使用WHERE IF语句来选择在某个日期之后创建的行,或者选择在某个范围内的行。语法如下: SELECT * FROM table_name WHERE IF(condition1, value1, condition2, value2, default_value) 其中,condition1和condition2是条件语句,value1和value2是与条件匹配的值,default_value是如果没有条件匹配时返回的默认值。 ### 回答2: MySQL中的WHERE与IF语句可以结合使用来实现更为复杂的数据查询和过滤操作,这个组合的用法常常可以帮助我们快速准确地获得需要的数据。 在MySQL中,WHERE语句会用来限制要查询的记录的范围。这个语句通常与SELECT或UPDATE语句一起使用,让SQL的操作只返回或处理符合条件的数据。 而IF语句则可以在处理SQL数据时实现一些条件判断和逻辑计算。使用 IF,你可以根据不同条件来执行不同的操作,也可以根据数据的条件来处理数据。在MySQL中,IF语句返回具有布尔值的结果,可以用于判断真假。 当我们需要对符号条件的数据进行筛选时,可以结合使用WHERE和IF语句。例如,以下是一条SQL语句: SELECT * FROM student WHERE IF(department='IT',1,0) AND grade>80; 这条语句实现了查询“IT”专业的分数在80分以上的学生信息。其中IF语句判断当前记录是否是“IT”专业的,这里IF(department='IT',1,0)的运行结果为1或0;WHERE语句则对结果进行筛选并输出匹配的记录。当然在实际应用场景中,可以将IF语句和WHERE语句嵌套多次,以实现更为复杂的数据查询和过滤操作。 需要注意,在使用WHERE与IF语句的同时,需要避免语句过于复杂,避免出现效率低下和慢查询的情况。因此,尽可能选择合适的语句结构,并对SQL代码进行优化,以提高代码的运行效率。 ### 回答3: MySQL中where if语句的使用可以实现根据条件判断来筛选数据的功能,也可以运用函数的计算进行筛选。它的具体用法如下: 1. 在查询中使用where if 在SELECT语句中使用WHERE IF语句,其基本语法如下: SELECT column_name(s) FROM table_name WHERE IF ( search_condition_1, search_value_1, IF(search_condition_2, search_value_2, search_value_3) ) 其中,IF函数后面括号内的三个参数分别为: · search_condition_1: 表示第一个查询条件,当此条件为真时,返回search_value_1的值; · search_value_1: 表示第一个查询条件成立时返回的值; · search_condition_2: 表示第二个查询条件,当第一个查询条件不成立时,执行第二个查询条件; · search_value_2、search_value_3 : 表示第二个查询条件成立返回的值,和第二个查询条件不成立返回的值。 2. 在UPDATE语句中使用WHERE IF 在UPDATE语句中使用WHERE IF,其基本语法如下: UPDATE table_name SET column_name = IF ( search_condition_1, update_value_1, IF(search_condition_2, update_value_2, update_value_3) ) WHERE some_column = some_value; 其中,IF函数后面括号内的三个参数分别为: · search_condition_1: 表示第一个查询条件,当此条件为真时,返回update_value_1的值; · update_value_1: 表示第一个查询条件成立时返回的值; · search_condition_2: 表示第二个查询条件,当第一个查询条件不成立时,执行第二个查询条件; · update_value_2、update_value_3 : 表示第二个查询条件成立返回的值,和第二个查询条件不成立返回的值。 在实际使用中,通过使用WHERE IF语句,我们可以对相应的数据进行更加精准的筛选和操作,以实现自己需要的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值