[英]Why NVL() doesn't work in the following outer join(+)?
“ 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
語法。 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.