oracle sql查询语句NVL无法正常工作

时间:2016-02-08 05:30:54

标签: sql oracle outer-join

我正在尝试学习oracle sql,下面是我的查询。我想打印每个人的经理,如果有人不是经理,那么它应该返回“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

2 个答案:

答案 0 :(得分:1)

我相信通过认识到当员工无人监管时,他的经理将没有匹配记录,可以简化已接受的答案。因此,两者经理的第一个姓氏将同时为NULLNULL

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 (+)运算符的更多信息。

答案 1 :(得分:1)

这是因为当m.first_name和m.last_name对于管理器为空时,m.first_name || ''|| m.last_name不会导致null,而是带''。因此,它将打印空间而不是“没有人”。您可以使用类似

的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(+);