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


1. 语法

1. NVL2(expr1, expr2, expr3)

2. 定义和用法

参数 expr1、expr2、expr3 均为表达式。

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

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

3. Oracle兼容说明

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

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

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

4. 示例

1. -- 1. 当expr2和expr3类型不同时,与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. +-----------------------+-----------------------------+------------------+

10. -- Oracle返回值,expr3转换成expr2的类型
11. SQL> SELECT NVL2(1, 2.0, 3.0) + 0, NVL2(1.111111, 3, 2.111111), NVL(3,2.111111) FROM DUAL;

13. NVL2(1,2.0,3.0)+0 NVL2(1.111111,3,2.111111) NVL(3,2.111111)
14. ----------------- ------------------------- ---------------
15. 2                         3               3

17. -- GreatSQL返回值,整型和字符串聚合成字符串
18. greatsql> SELECT NVL2(NULL, 1, 'GreatSQL'), NVL(1, 'GreatSQL') FROM DUAL;
19. +---------------------------+--------------------+
20. | NVL2(NULL, 1, 'GreatSQL') | NVL(1, 'GreatSQL') |
21. +---------------------------+--------------------+
22. | GreatSQL                  | 1                  |
23. +---------------------------+--------------------+

25. -- Oracle会报错,expr3字符串无法直接转换成expr2整型
26. SQL> SELECT NVL2(NULL, 1, 'GreatSQL'), NVL(1, 'GreatSQL') FROM DUAL;
27. SELECT NVL2(NULL, 1, 'GreatSQL'), NVL(1, 'GreatSQL') FROM DUAL
28. *
29. ERROR at line 1:
30. ORA-01722: invalid number

33. -- 2. GreatSQL中其他函数的处理方式
34. greatsql> SELECT NVL2(NULL, 1, 'GreatSQL'), if(NULL, 1, 'GreatSQL'), COALESCE(NULL, 1, 'GreatSQL'), NVL(3306, 'GreatQL') FROM DUAL;
35. +---------------------------+-------------------------+-------------------------------+----------------------+
36. | NVL2(NULL, 1, 'GreatSQL') | if(NULL, 1, 'GreatSQL') | COALESCE(NULL, 1, 'GreatSQL') | NVL(3306, 'GreatQL') |
37. +---------------------------+-------------------------+-------------------------------+----------------------+
38. | GreatSQL                  | GreatSQL                | 1                             | 3306                 |
39. +---------------------------+-------------------------+-------------------------------+----------------------+

41. -- 3. 正常案例
42. -- GreatSQL
43. greatsql> SELECT NVL2(0, 'ERROR', 'THIS'), NVL2(1, 'IS', 'ERROR'), NVL2(NULL, 'ERROR', 'A'), NVL2(1, 2, 3) FROM DUAL;
44. +--------------------------+------------------------+--------------------------+---------------+
45. | NVL2(0, 'ERROR', 'THIS') | NVL2(1, 'IS', 'ERROR') | NVL2(NULL, 'ERROR', 'A') | NVL2(1, 2, 3) |
46. +--------------------------+------------------------+--------------------------+---------------+
47. | ERROR                    | IS                     | A                        |             2 |
48. +--------------------------+------------------------+--------------------------+---------------+

50. -- Oracle
51. SQL> SELECT NVL2(0, 'ERROR', 'THIS'), NVL2(1, 'IS', 'ERROR'), NVL2(NULL, 'ERROR', 'A'), NVL2(1, 2, 3) FROM DUAL;

53. NVL2( NV N NVL2(1,2,3)
54. ----- -- - -----------
55. ERROR IS A           2

57. -- GreatSQL,全部返回NULL
58. greatsql> SELECT NVL2('GreatSQL', NULL ,3306), NVL2(NULL, 3306 ,NULL), NVL2(NULL, 3306, '') FROM DUAL;
59. +------------------------------+------------------------+----------------------+
60. | NVL2('GreatSQL', NULL ,3306) | NVL2(NULL, 3306 ,NULL) | NVL2(NULL, 3306, '') |
61. +------------------------------+------------------------+----------------------+
62. |                         NULL |                   NULL | NULL                 |
63. +------------------------------+------------------------+----------------------+

65. -- Oracle,全部返回空值
66. SQL> SELECT NVL2('GreatSQL', NULL ,3306), NVL2(NULL, 3306 ,NULL), NVL2(NULL, 3306, '') FROM DUAL;

68. NVL2('GREATSQL',NULL,3306) NVL2(NULL,3306,NULL) NVL2(NULL,3306,'')
69. -------------------------- -------------------- ------------------

72. SQL>

问题反馈

联系我们

扫码关注微信公众号

greatsql-wx