
# 条件表达式函数
#### coalesce(expr1, expr2, ..., exprn)
描述：返回参数列表中第一个非NULL的参数值。
COALESCE(expr1, expr2) 等价于CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END。
示例：
```
SELECT coalesce(NULL,'hello');
 coalesce
----------
 hello
(1 row)
```
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
- 如果表达式列表中的所有表达式都等于NULL，则本函数返回NULL。
- 它常用于在显示数据时用缺省值替换NULL。
- 和CASE表达式一样，COALESCE不会计算不需要用来判断结果的参数；即在第一个非空参数右边的参数不会被计算。
 
#### decode(base_expr, compare1, value1, Compare2,value2, ... default)
描述：把base_expr与后面的每个compare(n) 进行比较，如果匹配返回相应的value(n)。如果没有发生匹配，则返回default。
示例：
```
SELECT decode('A','A',1,'B',2,0);
 case
------
 1
(1 row)
```
#### if(bool_expr, expr1, expr2)
描述：当bool_expr为true时，返回expr1，否则返回expr2。
if(bool_expr, expr1, expr2) 等价于CASE WHEN bool_expr = true THEN expr1 ELSE expr2 END。
示例：
```
SELECT if(1 < 2, 'yes', 'no');
 if
-----
 yes
(1 row)
```
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
参数expr1和expr2可以为任意类型，返回结果类型规则请参考[UNION，CASE和相关构造](https://support.huaweicloud.com/sqlreference-dws/dws_06_0080.html)。
#### ifnull(expr1, expr2)
描述：当expr1不为NULL时，返回expr1，否则返回expr2。
ifnull(expr1, expr2) 逻辑上等价于CASE WHEN expr1 IS NOT NULL THEN expr1 ELSE expr2 END。
示例：
```
SELECT ifnull(NULL,'hello');
 ifnull
--------
 hello
(1 row)
```
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
参数expr1和expr2可以为任意类型，返回结果类型规则请参考[UNION，CASE和相关构造](https://support.huaweicloud.com/sqlreference-dws/dws_06_0080.html)。
#### isnull(expr)
描述：当expr为NULL时，返回true，否则返回false。
isnull(expr) 逻辑上等价于expr IS NULL。
示例：
```
SELECT isnull(NULL), isnull('abc');
 isnull | isnull
--------+--------
 t      | f
(1 row)
```
#### nullif(expr1, expr2)
描述：当且仅当expr1和expr2相等时，NULLIF才返回NULL，否则它返回expr1。
nullif(expr1, expr2) 逻辑上等价于CASE WHEN expr1 = expr2 THEN NULL ELSE expr1 END。
示例：
```
SELECT nullif('hello','world');
 nullif 
--------
 hello
(1 row)
```
备注：
如果两个参数的数据类型不同，则：
- 两种数据类型之间存在隐式转换，则以其中优先级较高的数据类型为基准将另一个参数隐式转换成该类型，转换成功则进行计算，转换失败则返回错误。如：
  ```
  SELECT nullif('1234'::VARCHAR,123::INT4);
   nullif 
  --------
     1234
  (1 row)
  ```
  ```
  SELECT nullif('1234'::VARCHAR,'2012-12-24'::DATE);
  ERROR:  invalid input syntax for type timestamp: "1234"
  ```
  
- 两种数据类型之间不存在隐式转换，则返回错误 。如：
  ```
  SELECT nullif(TRUE::BOOLEAN,'2012-12-24'::DATE);
  ERROR:  operator does not exist: boolean = timestamp without time zone
  LINE 1: SELECT nullif(TRUE::BOOLEAN,'2012-12-24'::DATE) FROM DUAL;
  ^
  HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
  ```
  
 
#### nvl( expr1 , expr2 )
描述：如果expr1为NULL则返回expr2。如果expr1非NULL，则返回expr1。
示例：
```
SELECT nvl('hello','world');
  nvl  
-------
 hello
(1 row)
```
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
参数expr1和expr2可以为任意类型，当NVL的两个参数不属于同类型时，看第二个参数是否可以向第一个参数进行隐式转换，如果可以则返回第一个参数类型。如果第二个参数不能向第一个参数进行隐式转换而第一个参数可以向第二个参数进行隐式转换，则返回第二个参数的类型。如果两个参数之间不存在隐式类型转换并且也不属于同一类型则报错。
#### sys_context( 'namespace' , 'parameter')
描述：获取并返回指定namespace下参数parameter的值。
返回值类型：text
示例：
```
SELECT sys_context('USERENV', 'CURRENT_SCHEMA');
 sys_context 
-------------
 public
(1 row)
```
根据当前所在的实际schema而变化。
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
目前仅支持SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') 和SYS_CONTEXT('USERENV', 'CURRENT_USER')两种格式。
#### greatest(expr1 \[, ...\])
描述：获取并返回参数列表中值最大的表达式的值。
- ORA和TD兼容模式下，返回结果为所有非null参数的最大值。
- MySQL兼容模式下，入参中存在null时，返回结果为null。
示例：
```
SELECT greatest(1*2,2-3,4-1);
 greatest 
----------
        3
(1 row)
```
```
SELECT greatest('ABC', 'BCD', 'CDE');
 greatest 
----------
 CDE
(1 row)
```
#### least(expr1 \[, ...\])
描述：获取并返回参数列表中值最小的表达式的值。
- ORA和TD兼容模式下，返回结果为所有非null参数的最小值。
- MySQL兼容模式下，入参中存在null时，返回结果为null。
示例：
```
SELECT least(1*2,2-3,4-1);
 least 
-------
    -1
(1 row)
```
```
SELECT least('ABC','BCD','CDE');
 least  
--------
 ABC
(1 row)
```
#### EMPTY_BLOB()
描述：使用EMPTY_BLOB在INSERT或UPDATE语句中初始化一个BLOB变量，取值为NULL。
返回值类型：BLOB
示例：
```
--新建表
CREATE TABLE blob_tb(b blob,id int) DISTRIBUTE BY REPLICATION;
--插入数据
INSERT INTO blob_tb VALUES (empty_blob(),1);
--删除表
 DROP TABLE blob_tb;
```
![](https://support.huaweicloud.com/sqlreference-dws/public_sys-resources/note_3.0-zh-cn.png)
使用DBMS.GETLENGTH求得的长度为0。
