簡體   English   中英

為什么NVL()在以下外部join(+)中不起作用?

[英]Why NVL() doesn't work in the following outer join(+)?

我試圖外部連接兩個表,並且當“全名”列中顯示空值時,將其替換為“無人”。

外部聯接工作正常, 問題是空值仍然為空,而不是“無人”。

以下是我的代碼。

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;

以下是結果的屏幕截圖。 在此處輸入圖片說明

感謝您的光臨!

“ 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;

可能是一個可行的選擇。

與其他數據庫不同,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邏輯要清楚得多。

因為表達式e.FIRST_NAME||' '||e.LAST_NAME e.FIRST_NAME||' '||e.LAST_NAME永遠不會為空。 如果該行是外部聯接的,則值為' '

由於尚無人提及,因此可以使用以下形式的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的情況下,名字或姓氏可能為null(但不能同時為兩者); 它將刪除剩余的尾隨/前導空間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM