#IFNULL
IFNULL函数有2个expr参数,当expr1不为NULL时返回expr1,否则返回expr2。
expr1,expr2的值可以为任意数据类型。当expr1和expr2的数据类型相同时,函数返回此数据类型的值。
当expr1,expr2其中之一为RAW、JSON、CLOB、BLOB、NCLOB类型时,不允许与其它类型搭配使用,两个参数必须类型相同,否则函数返回错误,函数返回值类型同expr数据类型。
当expr1,expr2其中之一为XMLTYPE时,expr1和expr2的数据类型必须相同,否则函数返回错误,函数返回值类型为XMLTYPE类型。
若expr1和expr2的数据类型不相同,函数将先进行隐式类型转换后再返回结果,基本规则如下:
expr1与expr2分属如下不同大类组时,函数返回VARCHAR类型:
数值型
日期时间型
字符型
ROWID
expr1与expr2其中之一为布尔型时:
另一方属于非数值型的其他大类时,函数返回VARCHAR类型。
另一方属于数值型(除BIT外)时,函数返回对应的数值类型。
另一方为BIT类型时,函数返回BIGINT类型。
expr1与expr2均属于字符型时,函数返回VARCHAR类型。
expr1与expr2均属于日期时间型时,函数返回类型如下表所示:
expr1/expr2 | DATE | TIME | TIMESTAMP | INTERVAL YEAR TO MONTH | INTERVAL DAY TO SECOND |
---|---|---|---|---|---|
DATE | DATE | DATE | TIMESTAMP | VARCHAR | VARCHAR |
TIME | DATE | TIME | TIMESTAMP | VARCHAR | VARCHAR |
TIMESTAMP | TIMESTAMP | TIMESTAMP | TIMESTAMP | VARCHAR | VARCHAR |
INTERVAL YEAR TO MONTH | VARCHAR | VARCHAR | VARCHAR | INTERVAL YEAR TO MONTH | VARCHAR |
INTERVAL DAY TO SECOND | VARCHAR | VARCHAR | VARCHAR | VARCHAR | INTERVAL DAY TO SECOND |
其中,在将TIME类型转换为DATE或TIMESTAMP类型时,年月日补充为当前日期。
- expr1与expr2均属于数值型时,函数返回类型如下表所示:
expr1/expr2 | BIT | TINYINT | SMALLINT | INT | BIGINT | FLOAT | DOUBLE | NUMBER |
---|---|---|---|---|---|---|---|---|
BIT | BIT | BIGINT | BIGINT | BIGINT | BIGINT | DOUBLE | DOUBLE | NUMBER |
TINYINT | BIGINT | TINYINT | SMALLINT | INT | BIGINT | FLOAT | DOUBLE | NUMBER |
SMALLINT | BIGINT | SMALLINT | SMALLINT | INT | BIGINT | FLOAT | DOUBLE | NUMBER |
INT | BIGINT | INT | INT | INT | BIGINT | FLOAT | DOUBLE | NUMBER |
BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | BIGINT | FLOAT | DOUBLE | NUMBER |
FLOAT | DOUBLE | FLOAT | FLOAT | FLOAT | FLOAT | FLOAT | DOUBLE | DOUBLE |
DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE | DOUBLE |
NUMBER | NUMBER | NUMBER | NUMBER | NUMBER | NUMBER | DOUBLE | DOUBLE | NUMBER(p/s) |
- expr1与expr2均为NUMBER类型且精度相同时,函数返回此精度的NUMBER类型。
- expr1与expr2为不同精度的NUMBER类型,或者一方为NUNBER类型,另一方为非NUMBER类型时,函数返回浮动精度的NUMBER类型。
示例
SELECT IFNULL(1, 2) res FROM DUAL;
RES
------------
1
SELECT IFNULL(NULL, 2) res FROM DUAL;
RES
-----
2
SELECT IFNULL(TRUE, 2) res FROM DUAL;
RES
------------
1
SELECT IFNULL(5, CAST('0.232222' AS FLOAT)) res,
TYPEOF (IFNULL(5, CAST('0.232222' AS FLOAT))) res_type
FROM DUAL;
RES RES_TYPE
----------- ----------
5.0E+000 float