我正在尝试学习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
答案 0 :(得分:1)
我相信通过认识到当员工无人监管时,他的经理将没有匹配记录,可以简化已接受的答案。因此,两者经理的第一个和姓氏将同时为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 (+)
运算符的更多信息。
答案 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(+);