Oracle兼容-函数-NVL2()函数


1. 语法

  1. NVL2(expr1, expr2, expr3)

2. 定义和用法

参数 expr1expr2expr3 均为表达式。

NVL2() 函数作用类似 IFNULL(),如果 expr1 不为 NULL,则返回 expr2;当 expr1 为 NULL 时,则返回 expr3

如果expr2和expr3类型不同,则返回的数据类型会依据expr2,expr3的类型自动选择其一并做适当转换。

3. Oracle兼容说明

GreatSQL中的 NVL2() 函数使用方法和Oracle中相同,但函数返回值类型与Oracle存在不同。

在Oracle中,如果 expr2expr3 类型不同,expr3 会转换为 expr2 的类型,如果不能转换,则会报错。

而在GreatSQL中,则会依据 expr2expr3 的类型,判断是否可聚合成为expr2expr3 的类型之一。这个处理方式与 NVL()COALESCE()IF()CASE() 等函数一致。

4. 示例

  1. -- 1. expr2expr3类型不同时,与oracle不同的示例
  2. -- GreatSQL返回值,整型和浮点型聚合成浮点型
  3. greatsql> SELECT NVL2(1, 2.0, 3.0) + 0, NVL2(1.111111, 3, 2.111111), NVL(3, 2.111111) FROM DUAL;
  4. +-----------------------+-----------------------------+------------------+
  5. | NVL2(1, 2.0, 3.0) + 0 | NVL2(1.111111, 3, 2.111111) | NVL(3, 2.111111) |
  6. +-----------------------+-----------------------------+------------------+
  7. | 2.0 | 3.000000 | 3.000000 |
  8. +-----------------------+-----------------------------+------------------+
  9. -- Oracle返回值,expr3转换成expr2的类型
  10. SQL> SELECT NVL2(1, 2.0, 3.0) + 0, NVL2(1.111111, 3, 2.111111), NVL(3,2.111111) FROM DUAL;
  11. NVL2(1,2.0,3.0)+0 NVL2(1.111111,3,2.111111) NVL(3,2.111111)
  12. ----------------- ------------------------- ---------------
  13. 2 3 3
  14. -- GreatSQL返回值,整型和字符串聚合成字符串
  15. greatsql> SELECT NVL2(NULL, 1, 'GreatSQL'), NVL(1, 'GreatSQL') FROM DUAL;
  16. +---------------------------+--------------------+
  17. | NVL2(NULL, 1, 'GreatSQL') | NVL(1, 'GreatSQL') |
  18. +---------------------------+--------------------+
  19. | GreatSQL | 1 |
  20. +---------------------------+--------------------+
  21. -- Oracle会报错,expr3字符串无法直接转换成expr2整型
  22. SQL> SELECT NVL2(NULL, 1, 'GreatSQL'), NVL(1, 'GreatSQL') FROM DUAL;
  23. SELECT NVL2(NULL, 1, 'GreatSQL'), NVL(1, 'GreatSQL') FROM DUAL
  24. *
  25. ERROR at line 1:
  26. ORA-01722: invalid number
  27. -- 2. GreatSQL中其他函数的处理方式
  28. greatsql> SELECT NVL2(NULL, 1, 'GreatSQL'), if(NULL, 1, 'GreatSQL'), COALESCE(NULL, 1, 'GreatSQL'), NVL(3306, 'GreatQL') FROM DUAL;
  29. +---------------------------+-------------------------+-------------------------------+----------------------+
  30. | NVL2(NULL, 1, 'GreatSQL') | if(NULL, 1, 'GreatSQL') | COALESCE(NULL, 1, 'GreatSQL') | NVL(3306, 'GreatQL') |
  31. +---------------------------+-------------------------+-------------------------------+----------------------+
  32. | GreatSQL | GreatSQL | 1 | 3306 |
  33. +---------------------------+-------------------------+-------------------------------+----------------------+
  34. -- 3. 正常案例
  35. -- GreatSQL
  36. greatsql> SELECT NVL2(0, 'ERROR', 'THIS'), NVL2(1, 'IS', 'ERROR'), NVL2(NULL, 'ERROR', 'A'), NVL2(1, 2, 3) FROM DUAL;
  37. +--------------------------+------------------------+--------------------------+---------------+
  38. | NVL2(0, 'ERROR', 'THIS') | NVL2(1, 'IS', 'ERROR') | NVL2(NULL, 'ERROR', 'A') | NVL2(1, 2, 3) |
  39. +--------------------------+------------------------+--------------------------+---------------+
  40. | ERROR | IS | A | 2 |
  41. +--------------------------+------------------------+--------------------------+---------------+
  42. -- Oracle
  43. SQL> SELECT NVL2(0, 'ERROR', 'THIS'), NVL2(1, 'IS', 'ERROR'), NVL2(NULL, 'ERROR', 'A'), NVL2(1, 2, 3) FROM DUAL;
  44. NVL2( NV N NVL2(1,2,3)
  45. ----- -- - -----------
  46. ERROR IS A 2
  47. -- GreatSQL,全部返回NULL
  48. greatsql> SELECT NVL2('GreatSQL', NULL ,3306), NVL2(NULL, 3306 ,NULL), NVL2(NULL, 3306, '') FROM DUAL;
  49. +------------------------------+------------------------+----------------------+
  50. | NVL2('GreatSQL', NULL ,3306) | NVL2(NULL, 3306 ,NULL) | NVL2(NULL, 3306, '') |
  51. +------------------------------+------------------------+----------------------+
  52. | NULL | NULL | NULL |
  53. +------------------------------+------------------------+----------------------+
  54. -- Oracle,全部返回空值
  55. SQL> SELECT NVL2('GreatSQL', NULL ,3306), NVL2(NULL, 3306 ,NULL), NVL2(NULL, 3306, '') FROM DUAL;
  56. NVL2('GREATSQL',NULL,3306) NVL2(NULL,3306,NULL) NVL2(NULL,3306,'')
  57. -------------------------- -------------------- ------------------
  58. SQL>

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx