2016-06-11 56 views
1

我試圖外連接兩個表,並且當「全名」列中顯示空值時,將其替換爲「無人」。爲什麼NVL()在下面的外連接(+)中不起作用?

外連接工作正常,問題是,空值仍爲空,而不是'沒有人'。

以下是我的代碼。

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; 

Follwing是結果的屏幕截圖。 enter image description here

感謝您的光臨!

+1

我會使用[coalesce](https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm)而不是'NVL' –

回答

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; 

可能是一個可行的選擇。

+0

這就是問題所在!謝謝!但是當我還想保留名字和姓氏之間的空格時,我應該如何解決這個問題?@ user2672165 – Wilheim

+0

@Wilheim添加了一條建議。 – user2672165

+0

這很完美!謝謝! @ user2672165 – Wilheim

2

因爲表達式e.FIRST_NAME||' '||e.LAST_NAME永遠不爲空。如果該行外連接,則值爲' '

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邏輯更清晰。

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是情況下,它可能有二:第一或姓氏可以爲空(但不能同時爲);它會移除將留下的拖尾/前導空間。

相關問題