1 분 소요

실수 상황

강효형은 수신상품 가입 진행중 중단된 고객 수를 추출하려고 하였다. 그런데, 쿼리 조회시 생각보다 수치가 너무 적게 나왔다. 이유는 무엇일까?

<>, !=에 대해서

사용한 쿼리(예시)

1
2
3
select * from 디지털개발팀
where 1=1
and 여자친구보유여부 <> '있음';

의도 : 여자친구보유여부가 ‘있음’이 아니면 여집합이 나오는 것으로 판단.
결과 : 여집합 중 일부만 조회됨.
설명

  • 오라클에서는 특정 값이 아닌 경우를 !=, <>, ^= 라는 기호를 통해 비교한다. 이를 부정연산자라고 한다.
  • 오라클 옵티마이저가 쿼리변형 하면서 !=, ^=를 <> 로 바꾸어 주기에 무엇을 사용하든 상관은 없으나, <>의 경우 ‘SQL표준(ISO/ANSI)’에 존재하므로, <>에 익숙해지는 편이 좋은 것으로 생각된다.
  • null의 경우 unknown 또는 N/A(not applicable:해당되지 않는)의 상태로, ‘존재하지 않다.’, ‘알 수 없다.’ 등으로 표현되고 있으나 ‘해당되지 않는다’라고 이해하는게 적절하다고 생각된다. (확장해서 null’값’이라는 표현도 적절하다고 할 수 있을까?)
    문과적으로 ‘디지털개발팀에 여자친구가 없는 사람들을 조회한다’라는 조회 문장에서 ‘여자친구가 존재하지 않는 유부남들’은 결과값으로 가져올 수 있다고 느껴지기 때문이다. 데이터에 ‘있음’이 들어있다면 여자친구가 있는 것이고, ‘없음’이 들어있다면 여자친구가 없는 것이지만, null이라면 ‘해당되지 않기 때문에’ 조회 결과에서 빠지게 되는 것이다.
  • 따라서 디지털개발팀 table의 여자친구보유여부 column에 data가 null이라면 이건 비교연산자를 통해 비교가 되는 대상에 해당되지 않는 것이므로 조회 대상에서 빠지게 되고, 결론적으로 유부남들은 결과값에 포함되지 않는 것이다.


그렇다면 어떻게 바꿀수 있을까?

1안 : 해당되지 않는 사람들도 포함

1
2
3
4
select * from 디지털개발팀
where 1=1
and 여자친구보유여부 <> '있음'
and 여자친구보유여부 is null;

설명 : 해당되지 않는 사람들도 포함할거야!라고 명시하여 결과값을 출력한다.

2안 : 해당 되지 않는 사람들을 유부남으로 반환하여 포함시킨다.

1
2
3
select * from 디지털개발팀
where 1=1
and NVL(여자친구보유여부, '유부남') <> '있음';

설명 : 해당되지 않는 사람들은 유부남이라고 부를거야. 따라서 유부남도 여자친구가 있는게 아니므로 결과값에 포함!

NVL에 대해서

NVL은 ‘NullVaLue’의 약어라고 한다. 느낌적인 느낌으로 Null에 값(Value)을 주는 것이라고 생각하면 된다. 대표적으로 NVL, NVL2가 있다.

NVL : NVL(컬럼명, 반환값)

  • 해당 컬럼의 데이터가 NULL일경우 반환값을 반환한다.

NVL2 : NVL(컬럼명, 반환값1, 반환값2)

  • 해당 컬럼의 데이터가 NULL일경우 반환값2, NULL이 아닐경우 반환값1을 반환한다.

참고 사이트

#Wakestand Islands님의 티스토리 #deftkang님의 티스토리 #양햄찌가 만드는 세상님의 티스토리

태그: ,

카테고리:

업데이트:

댓글남기기