宋子宪博客

Mysql8 SQL流程控制函数

流程处理函数可以根据不同的条件,执行不同的处理流程,可以在SQL语句中实现不同的条件选择。
MySQL中的流程处理函数主要包括IF()、IFNULL()和CASE()函数。

函数用法
IF(value,value1,value2)如果value的值为TRUE,返回value1,否则返回value2
IFNULL(value1, value2)如果value1不为NULL,返回value1,否则返回value2
CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2.... [ELSE resultn] END相当于Java的if...else if...else...
CASE expr WHEN 常量值1 THEN 值1 WHEN 常量值1 THEN 值1 .... [ELSE 值n] END相当于Java的switch...case...
IF
SELECT IF(1 > 0,'正确','错误')
->正确    
IFNULL
SELECT IFNULL(null,'Hello Word')
->Hello Word
CASE WHEN
SELECT CASE
WHEN 1 > 0
THEN '1 > 0'
WHEN 2 > 0
THEN '2 > 0'
ELSE '3 > 0'
END
->1 > 0

流程控制

/* IF单条件使用 /

/**如果大于等于8000算高工资,否则算低工资*/
select last_name ,salary ,if(salary >= 8000 ,'高工资' ,'低工资')
from employees;

IF多条件使用

/**如果 commission_pct不等于null,那就取它本身的值,如果等于null,则给它默认为0*/
select last_name ,commission_pct ,if(commission_pct is not null  ,commission_pct ,0) 'details',
/**并且计算它一年赚了多少钱*/
salary * 12 * ( 1 +if(commission_pct is not null ,phone_number ,0)) 'annual_sal'
from employees

IFNULL使用

/** 判断commission_pct为null 则输出0*/
select last_name ,commission_pct ,ifnull(commission_pct,0) 'details'
from employees

CASE WHEN 使用

基本语法

CASE WHEN 条件1 THEN 结果1 WHEN 条件2 THEN 结果2.... [ELSE resultn] END
相当于Java的if...else if...else...

示例SQL1

SELECT last_name ,salary ,

   /** 判断salary >= 15000 = 高薪 salary >=10000 ='种薪  salary >=8000 ='底薪' 否则等于 贫困户 END:代表结束 */
   CASE WHEN salary >=15000 THEN '高薪'
        WHEN salary >=10000  THEN '中新'
        WHEN salary >=8000 THEN '底薪'
        ELSE  '贫困户'  END 'Salary'

from employees ;

示例SQL2

需求:

/**
  查询部门号为 10,20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍, 20 号部门, 则打印其
工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数。
 */
    select employee_id ,last_name ,department_id ,salary,
            CASE  department_id WHEN 10  THEN salary * 1.1
                                WHEN 20  THEN salary * 1.2
                                WHEN 20  THEN salary * 1.3
                                ELSE salary * 1.4
                                END "details" /**details是别名*/
    from employees
where department_id in(10 ,20 ,30) ;

示例SQL3

/**
  查询部门号为 10,20, 30 的员工信息, 若部门号为 10, 则打印其工资的 1.1 倍, 20 号部门, 则打印其
工资的 1.2 倍, 30 号部门打印其工资的 1.3 倍数。
 */
select employee_id ,last_name ,department_id ,salary,
        CASE  department_id WHEN 10  THEN salary * 1.1
                            WHEN 20  THEN salary * 1.2
                            WHEN 20  THEN salary * 1.3
                            ELSE salary * 1.4
                            END "details" /**details是别名*/
from employees
where department_id in(10 ,20 ,30) ;

示例SQL4

SELECT oid,
       `status`,
       CASE `status`
           WHEN 1 THEN '未付款'
           WHEN 2 THEN '已付款'
           WHEN 3 THEN '已发货'
           WHEN 4 THEN '确认收货'
           ELSE '无效订单' END
FROM t_order;

示例SQL5

多个Count统计,统计未发货,已发货和已结完的订单

SELECT count(CASE WHEN state = 0 THEN 'noCount' END) AS noCount, /** 未发货*/
       count(CASE WHEN state = 1 THEN 'yesCount' END) AS yesCount, /**已发货*/
       count(CASE WHEN state = 2 THEN  'finishCount' END) AS finishCount  /**已完结*/
FROM  `order` ;
    from LOAN.LOAN_CASE_CENTRE loan_case_centre 
输出
+-------+--------+-----------+
|noCount|yesCount|finishCount|
+-------+--------+-----------+
|2      |4       |1          |
+-------+--------+-----------+

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »