1、背景介绍

最近被一个群成员问到了MySQL的IF()函数,上网搜索了一下,发现IF()函数与CASE函数一脉相承。之前有专门的文章写过CASE函数【请参考:《SQL CASE WHEN 用法的深度解析》】,再次看到CASE函数与IF函数并列出现,倍感亲切。

2、场景分析

新建一张客户表,如下:sex:1-男,2-女,3-未知;level是客户的级别:1-超级VIP客户,2-VIP客户,3-普通客户。这种情况可以使用case函数来实现,case函数是一种流程控制的函数。

3、CASE用法

CASE用法一:

CASE expression
WHEN value1 THEN returnvalue1
WHEN value2 THEN returnvalue2
WHEN value3 THEN returnvalue3
……
ELSE defaultreturnvalue
END

例子:

SELECT
    t.NAME,
    (
        CASE t.sex
        WHEN 1 THEN
            '男'
        WHEN 2 THEN
            '女'
        ELSE
            '未知'
        END
    ) 性别
FROM
    t_customer t

CASE用法二:

CASE
WHEN condition1 THEN returnvalue1
WHEN condition 2 THEN returnvalue2
WHEN condition 3 THEN returnvalue3
……
ELSE defaultreturnvalue
END

例子:

SELECT
    t.NAME,
    (
        CASE 
        WHEN t.sex=1 THEN
            '男'
        WHEN t.sex=2 THEN
            '女'
        ELSE
            '未知'
        END
    ) 性别
FROM
    t_customer t

4、IF()函数

使用CASE函数可以实现非常复杂的逻辑判断,可是若只是实现“如果符合条件则返回A,否则返回B”这样简单的判断逻辑的话,使用CASE函数就过于繁琐。MYSQL提供了IF()函数用于简化这种逻辑判断,其语法格式如下:

IF(expr1,expr2,expr3)

IF()函数说明:如果expr1的值为true,则返回expr2的值,如果expr1的值为false,则返回expr3的值。在MYSQL中IF()函数的用法类似于Java中的三目表达式,其用处也比较多。

select t.name,if(t.weight<80,'正常','肥胖') 体重 from t_customer t

5、IFNULL()函数

IF()函数的特例是IFNULL()函数,其用法是这样的:

IFNULL(expr1,expr2):

IFNULL()函数说明:如果expr1是NULL,则返回expr2;如果expr1不是NULL,则返回expr1。IFNULL()返回一个数字或字符串值,取决于它被使用的上下文环境。

SELECT IFNULL(NULL,1);

SELECT IFNULL(NULL,'hello world');

补充1:字符串的集合操作ELT()

ELT的含义为:Extract, Load, Transform。MySQL ELT()返回指定索引的参数值,函数的第一个参数是索引值,第二个参数开始以后是字符串类型的参数值。当索引的值小于1或者大于后面参数的个数时,函数返回NULL。用法如下所示:

ELT(N,str1,str2,str3,...),

ELT()函数说明:如果 N = 1,返回 str1,如果N = 2,返回 str2,等等。如果 N 小于 1 或大于参数的数量,返回 NULL。见下面的例子:

SELECT
    t. NAME,
    ELT(
        t. LEVEL,
        '超级VIP',
        'VIP',
        '普通'
    ) 客户类型
FROM
    t_customer t

补充2:字符串的集合操作FIELD()

FIELD(str,str1,str2,str,str3,str4...)

FIELD()函数说明:返回str在后面的参数列(str1,str2,str,str3,str4...)中的索引,起始索引为1。如果未在参数列中发现str 则返回0。

SELECT FIELD('hello','hello','world','你好','世界');

补充3:条条大路通罗马

条条大路通罗马,但是有的路却是曲折的。ELT()、FIELD()、IFNULL()的组合也能实现CASE WHEN的效果,但是读起来十分绕口:

SELECT *,IFNULL(ELT(FIELD(type,'1','2','3','4'),'来源A','来源B','来源C','来源D'),'未知') name from order;

标签: none

添加新评论