1

我正在尝试将两个表外连接,当“全名”列中显示空值时,将其替换为“没有人”。

外连接工作正常,问题是,空值仍然为空,而不是“没有人”。

以下是我的代码。

SELECT 
NVL(to_char(e.FIRST_NAME||' '||e.LAST_NAME),'No One') "Full Name",
d.DEPARTMENT_NAME
FROM EMPLOYEES e,DEPARTMENTS d
WHERE e.DEPARTMENT_ID(+)=d.DEPARTMENT_ID;

以下是结果的屏幕截图。 在此处输入图像描述

感谢您的关注!

4

4 回答 4

5

“NVL 不起作用”,因为在 NVL 的参数中总是至少有一个空格字符。

SELECT 
decode(e.FIRST_NAME||e.LAST_NAME,null,'No one',e.FIRST_NAME||' '||e.LAST_NAME) "Full Name",
d.DEPARTMENT_NAME
FROM EMPLOYEES e,DEPARTMENTS d
WHERE e.DEPARTMENT_ID(+)=d.DEPARTMENT_ID;

可能是一个可行的选择。

于 2016-06-11T11:46:34.330 回答
4

与其他数据库不同,Oracle 允许字符串中的NULL值连接。

我会将您的查询写为:

SELECT (CASE WHEN e.FIRST_NAME IS NULL AND e.LAST_NAME IS NULL THEN 'No One'
             WHEN e.FIRST_NAME IS NULL THEN e.LAST_NAME
             WHEN e.LAST_NAME IS NULL THEN e.FIRST_NAME
             ELSE e.FIRST_NAME || ' ' || e.LAST_NAME
        END) "Full Name", d.DEPARTMENT_NAME
FROM DEPARTMENTS d LEFT JOIN
     EMPLOYEES e
     ON e.DEPARTMENT_ID = d.DEPARTMENT_ID;

笔记:

  • 这使用适当的显式JOIN语法。连接的(+)表示法是古老的并且已被弃用。您应该学习正确的显式JOIN语法。
  • 当其中一个值丢失时,逻辑在名称的开头/结尾不再有多余的空格。
  • 逻辑是明确的并使用 ANSI 标准CASE表达式。

此外,还有一些缩短表达式的好方法:

coalesce(trim(e.FIRST_NAME || ' ' || e.LAST_NAME), 'No One')

我只是认为case逻辑更清晰。

于 2016-06-11T12:08:12.193 回答
2

因为表达式e.FIRST_NAME||' '||e.LAST_NAME永远不会为空。如果该行是外部连接的,则值为' '

于 2016-06-11T11:48:38.313 回答
0

由于还没有人提到它,你可以使用 NVL2,它的形式如下:

NVL2(<expression>, <value if expression is not null>, <value if expression is null>)

所以你可以简单地做:

NVL2(e.FIRST_NAME||e.LAST_NAME, TRIM(e.FIRST_NAME||' '||e.LAST_NAME), 'No One') "Full Name"

TRIM 的情况是,名字或姓氏都可能为空(但不能同时为空);它将删除将留下的尾随/前导空格。

于 2016-06-12T03:19:33.727 回答