MySQL的条件判断函数
1、CASE WHEN
条件判断函数
CASE WHEN
语句能在 SQL
语句中织入判断逻辑, 类似于 Java
中的 if else
语句。它分为简单函数和条件表达式
1.1. 简单函数
下面通过一个简单的示例来看一下具体用法,表 user_biz_info
需求说明:在 user_biz_info表中,sex = 1
表示男性,sex = 0
表示女性,查询时转换成汉字显示
SELECT gender, username,( CASE gender WHEN 1 THEN '男' ELSE '女' END ) AS sex
FROM
user_biz_info
1.2.条件表达式
下面通过一个简单的示例来看一下具体用法,表 finance_order_detail
SELECT
sub_order_sn,
settle_price,
settle_type,
( CASE WHEN settle_type = 2 THEN '底价供货' WHEN settle_type = 1 THEN '扣点' WHEN settle_type = 3 THEN '自营买断' END ) AS test_type
FROM
finance_order_detail
或者
SELECT
sub_order_sn,
settle_price,
settle_type,
( CASE WHEN settle_type = 2 THEN '底价供货' WHEN settle_type = 1 THEN '扣点' else '自营买断' END ) AS test_type
FROM
finance_order_detail
1.3. 结合使用
CASE WHEN
和聚合函数综合使用,能实现更加复杂的统计功能
需求:统计不同指标类型对应的数量,以及订单数为1的数量
SELECT
SUM(CASE WHEN target_id = 'O3' THEN 1 ELSE 0 END ) AS 数量3,
SUM(CASE WHEN target_id = 'O1' THEN 1 ELSE 0 END ) AS 数量1,
SUM(case WHEN target_id='O2' and order_num=1 THEN 1 ELSE 0 END) as 数量2
from dwd_month_order_num
1.4.IF() 条件判断函数
-- expr 是一个条件表达式,如果结果为 true,则返回 result_true,否则返回 result_false
IF(expr, result_true, result_false)
实例:
SELECT
`name`,
IF( sex = 1, '男', '女' ) AS sex
FROM
score
if函数也可以和聚合函数一起使用
select num ,
sum(if (sex=1,1,null)) as 女生人数,
sum(if (sex=0,1,null)) as 男生人数
from score
1.5.ifnull条件判断函数
IFNULL(expr1, expr2)
,如果 expr1
的值为 null
,则返回 expr2
的值,如果 expr1
的值不为 null
,则返回 expr1
的值
SELECT IFNULL(NULL,'B'); -- 输出结果:B
SELECT IFNULL('HELLO','B'); -- 输出结果:HELLO
使用语法如下
select IFNULL(gmt_last_active,0) gmt_last_active from user_biz_info where nickname= '用户1'
但使用 IFNULL
语句,如果 where
条件中的 name
值是不存在的,那么仍将返回 NULL
1.6.ifnull函数结合聚合函数使用
-- 返回结果:0
SELECT IFNULL(SUM(price), 0) FROM goods WHERE status = 3
其他 AVG、COUNT
等用同样方式处理,而且无论 where
条件存在不存在,结果都是会返回 0
的
1.7.NULLIF()
条件判断函数
NULLIF(expr1, expr2)
,如果 expr1 = expr2
成立,那么返回值为 null
,否则返回值为 expr1
的值;
SELECT ISNULL(NULL); -- 输出结果:1
SELECT ISNULL('HELLO'); -- 输出结果:0
1.8.ISNULL()
条件判断函数
ISNULL(expr)
,如果 expr
的值为 null
,则返回 1
,如果 expr1
的值不为 null
,则返回 0
SELECT ISNULL(NULL); -- 输出结果:1
SELECT ISNULL('HELLO'); -- 输出结果:0