1

2つのテーブルを外部結合しようとしていて、「フルネーム」の列にnull値が表示されている場合は、「なし」に置き換えます。

外部結合は正常に機能しましたが、問題は、null 値が「誰も」ではなく、まだ null であることです。

以下は私のコードです。

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 への引数には常に少なくとも 1 つのスペース文字があるため、「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適切な明示的な構文を学ぶ必要があります。
  • 値の 1 つが欠落している場合、ロジックの名前の先頭/末尾に余分なスペースがなくなりました。
  • ロジックは明示的であり、ANSI 標準CASE式を使用します。

さらに、式を短縮するための凝った方法があります。

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

caseロジックがより明確になったと思います。

于 2016-06-11T12:08:12.193 に答える
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 は、姓または名のいずれかが null になる可能性がある場合です (両方ではない)。残っている末尾/先頭のスペースを削除します。

于 2016-06-12T03:19:33.727 に答える