繁体   English   中英

oracle sql查询语句NVL无法按预期工作

[英]oracle sql query statement NVL not working as desired

我正在尝试学习oracle sql,下面是我的查询。 我想打印每个人的经理,如果某人不是经理,那么它应该返回“ Noone”。

问题:我得到的是空白声明,而不是“ Noone”。 有什么帮助吗?

SELECT NVL(m.first_name || ' '
    || m.last_name, 'No One') || ' supervises '
    || w.first_name || ' ' || w.last_name
  FROM employees w, employees m
 WHERE w.manager_id = m.employee_id(+);

NVL(M.FIRST_NAME||''||M.LAST_NAME,'NOONE')||'SUPERVISE
------------------------------------------------------
James Smith supervises Ron Johnson
Ron Johnson supervises Susan Jones
Ron Johnson supervises Fred Hobbs
  supervises James Smith

我相信可以通过以下方式简化公认的答案:认识到在不受监督的情况下,将没有与其经理匹配的记录。 其结果是, 无论是经理人的姓氏名字要么是NULL或不NULL在一起。

SELECT NVL(m.first_name, 'No One', m.first_name || ' ' || m.last_name)
    || ' supervises ' || w.first_name || ' ' || w.last_name
FROM employees w LEFT JOIN employees m
    ON w.manager_id = m.employee_id

更新:

(+)运算符是Oracle对LEFT JOIN的语法。 请查看此Stack Overflow文章,以了解有关Oracle (+)运算符的更多信息。

这是因为原因,当管理者的m.first_name和m.last_name为null时,则m.first_name || ''|| m.last_name不会为空,但会带有''。 因此,它将打印空间而不是“ Noone”。 您可以使用nvl2之类的方法来达到所需的结果

SELECT NVL2( m.first_name ||m.last_name , m.first_name || ' ' || m.last_name, 'No One' )
   || ' supervises '
   || w.first_name
   || ' '
   || w.last_name FROM employees w, employees m WHERE w.manager_id = m.employee_id(+);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM