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

oracle sql query statement NVL not working as desired

我正在尝试学习 oracle sql 以下是我的查询。我想打印每个人的经理,如果有人不是经理,那么它应该 return "No One".

问题:我得到的是空白语句而不是 "No One"。有帮助吗?

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 的语法。查看 this Stack Overflow article 以了解有关 Oracle 的 (+) 运算符的更多信息。

这是因为当 m.first_name 和 m.last_name 对经理来说为空时,那么 m.first_name || ' ' || m.last_name 不会导致 null,但带有 ' '。因此,它将打印 space 而不是 'No One'。你可以通过使用 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(+);