【问题标题】:oracle sql query statement NVL not working as desiredoracle sql 查询语句 NVL 无法按预期工作
【发布时间】:2016-02-08 05:30:53
【问题描述】:

我正在尝试学习 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

【问题讨论】:

标签: sql oracle outer-join


【解决方案1】:

这是因为当 m.first_name 和 m.last_name 对 manager 为 null 时,m.first_name || '' || m.last_name 不会导致 null,而是带有 ' '。因此,它将打印空间而不是“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(+);

【讨论】:

  • 我会将您的答案标记为正确。只是想知道这个查询 (WHERE w.manager_id = m.employee_id(+)) 中的 (+) 代表什么?
  • @TimBiegeleisen:是的,理想情况下我会正确地标记你的答案,但我是一个完整的新手,这个答案是我很好理解的。不过,我会赞成你的回答。只是想知道 (+) 在我的查询中做了什么。
  • 这是oracle特定的左外连接方式stackoverflow.com/a/4020794/2594724
【解决方案2】:

我相信通过认识到当员工无人监督时,他的经理将没有匹配的记录,可以简化接受的答案。因此,both 经理的名字要么是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 的 (+) 运算符的更多信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-15
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多