Search

条件运算函数

简单CASE表达式

``````CASE expression
WHEN value THEN result
[ WHEN ... ]
[ ELSE result ]
END``````
• 命令说明：从左到右依次查找`value`，如果找到和`expression`相等的`value`则返回对应的`result`结果；如果未找到相等的`value`，则返回`ELSE`语句中`result`结果。

• 示例：以下示例将`person`表中`age``10`的记录的改为`50`，其他`age`均加`10`

``````  select * from hello_mysql_vpc_rds.person
+------+------+----+
| id  | name | age |
+-----+------+-----+
|    1| james|   10|
|    2| bond |   20|
|    3| jack |   30|
|    4| lucy |   40|
+------+------+----+
select *, case age when 10 then 50 else(age+10) end as new_age
from hello_mysql_vpc_rds.person
+-----+------+-----+-----+
| id  | name | age |new_age
+-----+------+-----+-----+
|    1| james|   10| 50  |
|    2| bond |   20|30   |
|    3| jack |   30|40   |
|    4| lucy |   40|50   |``````

高级CASE表达式

``````CASE
WHEN condition THEN result
[ WHEN ... ]
[ ELSE result ]
END``````
• 命令说明：从左到右依次计算`condition`直到第一个为`TRUE``condition`，返回对应的`result`结果。如果没有为`True``condition`，返回`ELSE`子句的`result`结果。

• 示例：以下示例将`person`表中`age``10`的记录改为`age+10``name``bond``age`改为`age+20`，其他记录的`age`均改为`age+30`

``````  select * from hello_mysql_vpc_rds.person
+------+------+----+
| id  | name | age |
+-----+------+-----+
|    1| james|   10|
|    2| bond |   20|
|    3| jack |   30|
|    4| lucy |   40|
+------+------+----+
select *, case when age=10 then (age+10) when name='bond' then (age+20) else (age+30) end from hello_mysql_vpc_rds.person
+-----+------+-----+-----+
| id  | name | age |new_age
+-----+------+-----+-----+
|    1| james|   10| 20  |
|    2| bond |   20| 40  |
|    3| jack |   30| 60  |
|    4| lucy |   40| 70  |``````

IF

``IF(condition,true_value)``
• 命令说明：如果`condition``true`，返回`true_value`；否则返回`null`

• 示例：

``````  select if((2+3)>4,5);
+-------+
| _col0 |
+-------+
|     5 |``````
``IF(condition,true_value,false_value)``
• 命令说明：如果`condition``true`，返回`true_value`；否则返回`false_value`

• 示例：

``````  select if((2+3)<5,5，6);
+-------+
| _col0 |
+-------+
|     6 |``````

IFNULL

``IFNULL(expr1,expr2)``
• 命令说明：如果`expr1`结果不为`null`，返回`expr1`的值；否则返回`expr2`的值。

• 示例：

``````  select ifnull(NULL,2);
+-------+
| _col0 |
+-------+
|     2 |
select ifnull(1,0);
+-------+
| _col0 |
+-------+
|     1 |``````

NULLIF

``NULLIF(expr1,expr2)``
• 命令说明：如果`expr1``expr2`值相等，返回`NULL`；否则返回`expr1`的值。

• 示例：

``````  select nullif(2,1);
+-------+
| _col0 |
+-------+
|     2 |
select nullif(2,2);
+-------+
| _col0 |
+-------+
| NULL  |``````

COALESCE

``COALESCE(value[, …])``
• 命令说明：从左到右依次查找`value`，返回第一个非`null``value`

• 示例：

``````  select coalesce(null,2,3);
+--------------------+
| coalesce(null,2,3) |
+--------------------+
|                  2 |``````

TRY

``TRY(expression)``
• 命令说明：计算并返回表达式`expression`的值，如果计算表达式时遇到错误则返回`null`

• 查询数据时，如果您不希望查询过程抛出异常，可以使用TRY函数屏蔽异常。

• TRY函数遇到异常时默认返回`null`，您可以使用COALESCE函数指定TRY函数遇到异常时的返回值。

• TRY函数可以处理以下错误：

• 除0。

• 无效的转换或者无效的函数参数。

• 数值大小超出规定范围。

• 示例：

``````  select try(3/0);
+----------+
| try(3/0) |
+----------+
| NULL     |``````
``````  select try(3/2);
+----------+
| try(3/2) |
+----------+
|      1.5 |``````

源数据中包含非法数据：

``````  select * from shipping;
---------------------------------------------------
origin_state  | origin_zip | packages | total_cost
--------------+------------+----------+------------
California   |      94131 |       25 |        100
California   |      P332a |        5 |         72
California   |      94025 |        0 |        155
New Jersey   |      08544 |      225 |        490``````

查询中不使用TRY函数时，查询失败。

``````  select cast(origin_zip as BIGINT) from shipping;
---------------------------------------------------
Query failed: Can not cast 'P332a' to BIGINT``````

查询中使用TRY函数时，查询不会报错。

``````  select try(cast(origin_zip as BIGINT)) from shipping;
------------
origin_zip
------------
94131
NULL
94025
08544``````

COALESCE嵌套TRY函数，查询报错时将返回指定值。

``````  select coalesce(try(total_cost/packages), 0) as per_package from shipping;
-------------
per_package
-------------
4
14
0
19``````

GREATEST

``GREATEST(value1,value2,...)``
• 命令说明：返回参数中的最大值。

• 示例：

``````  select greatest(2,0);
+---------------+
| greatest(2,0) |
+---------------+
|             2 |``````
``````  select greatest('B','A','C');
+-----------------------+
| greatest('B','A','C') |
+-----------------------+
| C                     |``````

LEAST

``LEAST(value1,value2,...)``
• 命令说明：返回参数中的最小值。

• 示例：

``````  select least('B','A','C');
+--------------------+
| least('B','A','C') |
+--------------------+
| A                  |``````
``````  select least(34.0,3.0,5.0,767.0);
+---------------------------+
| least(34.0,3.0,5.0,767.0) |
+---------------------------+
|                       3.0 |``````

NVL2

``NVL2(expr1,expr2,expr3)``
• 命令说明：如果`expr1`的结果为非`null`值，将返回`expr2`的值；如果`expr1`的结果为`null`值，将返回`expr3`的值。

• 示例：

``````  select nvl2(1, 2, 3);
+---------------+
| nvl2(1, 2, 3) |
+---------------+
|             2 |``````
``````  select nvl2(null, 2, 3);
+------------------+
| nvl2(null, 2, 3) |
+------------------+
|                3 |``````

DECODE

``DECODE(expr,search1,result1,search2,result2,...searchn,resultn,default)``
• 命令说明：从左到右依次查找，如果`expr`的值等于`search1`则返回`result1`，如果`expr`的值等于`search2`则返回`result2`，以此类推，如果没有与`expr`相等的`result`，则返回`default`

• 示例：

``````  select decode(1, 1, '1A', 2, '2A', '3A');
+-----------------------------------+
| decode(1, 1, '1A', 2, '2A', '3A') |
+-----------------------------------+
| 1A                                |``````
``````  select decode(1, 2, '1A', 1, '2A', '3A');
+-----------------------------------+
| decode(1, 2, '1A', 1, '2A', '3A') |
+-----------------------------------+
| 2A                                |``````
``````  select decode(1, 2, '1A', 2, '2A', '3A');
+-----------------------------------+
| decode(1, 2, '1A', 2, '2A', '3A') |
+-----------------------------------+
| 3A                                |``````