null값 비교 0 3 1,519

by 가을에사랑 [2018.04.05 11:03:47]


select
    a.*, b.content
from
(
    select '1' eduseq, 'a' id, 'seoul' place from dual
    union all
    select '1' eduseq, 'b' id, 'jeju' place from dual
    union all
    select '2' eduseq, '' id, 'jeju' place from dual
    union all
    select '3' eduseq, '' id, 'busan' place from dual
)a,
(
    select '1' eduseq, 'a' id, 'good' content from dual
    union all
    select '3' eduseq, '' id, 'very' content from dual
)b
where 1=1
    and a.eduseq = b.eduseq(+)
    and a.id = b.id(+)
order by a.eduseq

 

위 쿼리에서 id는 널일수도 아닐수도 있습니다.

널이면 eduseq가 고유값이라 문제가 되지 않는 상태인데

3번의 경우 id가 널이다 보니 위의 where절처럼 사용하면

3번의 content가 누락이 되서 나오지 않습니다.

그래서 id가 널인 경우 nvl()로 처리해서 해결은 했지만

방법이 어거지 같은 느낌이라

혹시 더 나은 좋은 해결책을 문의드려봅니다.

by 마농 [2018.04.05 12:25:34]

널은 비교식에 사용할 수 없으므로
  - 널끼리 비교하려면 NVL 해야 합니다.
  - 아니면 IS NULL 을 OR 조건으로 복잡하게 엮어서 사용해야 하겠지요.
혹시 b.eduseq 가 Unique 한가요?
  - 그렇다면? Where 절에서 id 조건을 빼고
  - Select 절에서 조건처리(Decode)하셔도 되구요.
더 나은 방법은?
  - 널이 입력되지 않도록 기본값을 가지도록 설계를 바꿔야죠.
  - 조인에 사용될 키가 널이라는게 애초에 설계 잘못입니다.


by 가을에사랑 [2018.04.05 13:14:51]

알겠습니다. 감사합니다.^^


by 우리집아찌 [2018.04.05 13:19:43]

이미 고치기 힘든 구조라면 경우에 따라 디폴트로 처리 하실수도 있지요

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입