2016-06-11 6 views
1

두 테이블을 외부 조인하려고하고 "전체 이름"열에 null 값이 표시된 경우 '없음'으로 바꿉니다.NVL()이 다음 외부 조인 (+)에서 작동하지 않는 이유는 무엇입니까?

외부 조인이 제대로 작동합니다. 문제는 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; 

Follwing은 결과의 스크린 샷입니다. enter image description here

감사합니다.

+1

'NVL' 대신 [coalesce] (https://docs.oracle.com/cd/B28359_01/server.111/b28286/functions023.htm)를 사용합니다 –

답변

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

이것이 문제입니다! 감사! 그러나 나는 여전히 성 (姓)과 성 (姓) 사이에 공백을두고 싶을 때 어떻게 수정해야합니까[email protected] user2672165 – Wilheim

+0

@Wilheim이 제안을 추가했습니다. – user2672165

+0

완벽하게 작동합니다! 감사! @ user2672165 – Wilheim

2

e.FIRST_NAME||' '||e.LAST_NAME이 결코 null이 아니기 때문에. 행이 외부 조인 인 경우 값은 ' '입니다.

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 식을 사용합니다. 난 그냥 case 논리가 훨씬 명확 생각

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

    :

그리고 추가, 식을 단축 멋진 방법이 있습니다. 아무도 아직 그것을 언급하지 않기 때문에

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" 

트림은 가능 사건 중 하나를 먼저 또는 성은 null 일 수 있지만 (둘 다는 아님); 그것은 남아있는 후행/선행 공간을 제거합니다.