NVL、NVL2场景分析
今天在实际在线运行的项目中遇到了界面显示的问题,界面显示拼接的字段时,部分显示多了一些不太雅观的“–”,格式如“XXXX–”。
。。。。。。
具体问题详见如下的截图:
聪明的你发现什么问题了吗?查询出的数据部分后面多了 2 个横线!
。。。。。。
如果没有什么好办法,那先看 Oracle 中的 2 个方法吧!
-- NVL
语法:
nvl(expr1,expr2)
如果 expr1 是 null 值,则 nvl 函数返回 expr2 ,否则就返回 expr1 。
说明:
参数 expr1、expr2 可以是任何数据类型,但应该保持相同。
若两者数据类型不一致,则Oracle数据库会隐式的转换其中一个的数据类型使其保持和另一个一致,若无法转换则会返回错误。
隐式转换的实施规则如下:
(1)若 expr1 是字符数据,则Oracle数据库在比较之前就会把 expr2 转换成 expr1 的数据类型,并且返回VARCHAR2 数据类型到 expr1 的字符集。
(2)若 expr1 是数值型,则Oracle数据库决定哪个参数具有最高数值优先级,并把另一个参数的数据类型隐式转换成这种数据类型,并返回这种数据类型的数据。
(3)如果两个参数都为NULL ,则返回NULL。
不过NVL依旧不能解决问题啊?最后用NVL2()函数,进行了选择性的判断,问题得以解决。
-- NVL2
语法:
nvl2(expr1,expr2,expr3)
如果 expr1 不是 null 值,则 nvl 函数返回 expr2 ,否则就返回 expr3 。参数可以返回任何数据类型的值,但是 expr2 和 expr3 不能是 LONG 型的数据类型。
说明:
若 expr2 和 expr3 的数据类型不同:
(1)若 expr2 是字符数据,则Oracle数据库在比较之前就会把 expr3 转换成 expr2 的数据类型除非 expr3 是null。在 这种情况下,隐式数据转换是不必要的。
(2)若 expr2 是数值型,则Oracle数据库决定哪个参数具有最高数值优先级,并把另一个参数的数据类型隐式转换成这种数据类型,并返回这种数据类型的数据。
看完 NVL 和 NVL2 的具体含义,相信你应该有所眉目了,下面直接贴出实验sql语句和查询结果截图。
操作实例相关sql语句:
--[1]创建用户表
CREATE TABLE userr (
NAME VARCHAR2(50),
email VARCHAR2(50));
--[2]批量插入用户数据
-- 如果想进一步了解批量插入,可以查考相关博文(下面已给出链接)
INSERT INTO userr(NAME,email)
SELECT '张三','123@qq.com' FROM dual
UNION ALL SELECT '李四','456@qq.com' FROM dual
UNION ALL SELECT '王五','' FROM dual
UNION ALL SELECT '小王','789@qq.com' FROM dual
UNION ALL SELECT '小程','' FROM dual
UNION ALL SELECT '小梁','129@qq.com' FROM dual;
--[3]实例相关查询语句
SELECT u.name || '--' || u.email FROM userr u;
SELECT u.name || NVL2(u.email,'--','') || u.email FROM userr u;
解决后的结果截图: