YashanDB IFNULL函数

42 阅读2分钟

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/expr2BITTINYINTSMALLINTINTBIGINTFLOATDOUBLENUMBER
BITBITBIGINTBIGINTBIGINTBIGINTDOUBLEDOUBLENUMBER
TINYINTBIGINTTINYINTSMALLINTINTBIGINTFLOATDOUBLENUMBER
SMALLINTBIGINTSMALLINTSMALLINTINTBIGINTFLOATDOUBLENUMBER
INTBIGINTINTINTINTBIGINTFLOATDOUBLENUMBER
BIGINTBIGINTBIGINTBIGINTBIGINTBIGINTFLOATDOUBLENUMBER
FLOATDOUBLEFLOATFLOATFLOATFLOATFLOATDOUBLEDOUBLE
DOUBLEDOUBLEDOUBLEDOUBLEDOUBLEDOUBLEDOUBLEDOUBLEDOUBLE
NUMBERNUMBERNUMBERNUMBERNUMBERNUMBERDOUBLEDOUBLENUMBER(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