MySQL 使用 IF 判断是否执行 SQL

MySQL 使用 IF 判断是否执行 SQL

语法
if(condition, value_if_true, value_if_false)

上面的三个参数的意思是,如果 condition(表达式)为 true,则执行表达式 value_if_true,否则执行表达式 value_if_false

例如有下面这个 User 用户表:

1
2
3
4
5
6
7
8
9
CREATE TABLE User (
name VARCHAR(10) NOT NULL
COMMENT '姓名',
age INT NOT NULL
COMMENT '年龄',
sex BOOLEAN NOT NULL
COMMENT '性别'
)
COMMENT '用户表'

一个简单的根据属性查询列表的 SQL 语句大致如下:

1
2
3
4
5
6
SELECT *
FROM User
WHERE
name = ?
AND age = ?
AND sex = ?;

那么,现在问题来了。我们有一个需求就是如果性别为空,就查询全部的性别,否则就根据性别进行查询。这时就可以使用 if 来进行判断了(吾辈的某位同事就是碰到了这个坑。。。),如果 condition(sex = null) 为 true,就直接执行表达式 value_if_true(true),否则执行 value_if_false(sex = ?)。

1
2
3
4
5
6
SELECT *
FROM User
WHERE
name = ?
AND age = ?
AND if(sex = NULL, TRUE, sex = ?);

注:这里不要使用 1 = 1 而直接使用 true 就好了。
PS:这难道就是所谓的习惯成自然么。。。
附:诚然,在使用了 ORM 框架(例如 Mybatis 后),基本上都可以对传入的参数进行判空处理,然而有时候会出现一种情况:
某个属性经由其他属性统合计算而得到,并非是实体(或是其他的什么)传入进来的参数,那便是只能使用 SQL 的原生语法了呢