DB 조건절에 Null 허용 컬럼 사용 시 주의할 점
서론
쿼리 조건절에 Null 허용 컬럼에 대한 존재여부를 판단하는 조건을 넣을 때 주의해야할 점에 대해서 배워보겠습니다.
DB 조건절에 Null 허용 컬럼 사용 시 주의할 점
하나의 쿼리를 예시로 들어 설명하겠습니다.
첫 번째 쿼리
SELECT
SEQ,
NAME,
DISCRHASH
FROM RESERVATION
WHERE 1=1
AND NAME = 'John'
DISCRHASH 컬럼은 Nullable 한 컬럼입니다. (즉, 널 값이 들어갈 수 있는 컬럼 입니다.)
위 쿼리의 결과는 다음과 같습니다.
SEQ | NAME | DISCRHASH
1 John BlahBlah
2 John Null
3 John abc
여기서 우리는 DISCRHASH 의 값이 BlahBlah 이 아닌 데이터를 조회하는 것을 목표로 하겠습니다.
두 번째 쿼리
DISCRHASH 의 값이 BlahBlah 이 아닌 데이터를 조회하기 위해 만든 두 번째 쿼리는 다음과 같습니다.
SELECT
SEQ,
NAME,
DISCRHASH
FROM RESERVATION
WHERE 1=1
AND NAME = 'John'
AND DISCRHASH <> 'BlahBlah'
여기서 연산자는 <>, !=, NOT IN, LIKE 어떤 것을 사용해도 상관 없습니다.
두 번째 쿼리의 결과는 다음과 같습니다.
SEQ | NAME | DISCRHASH
3 John abc
DISCRHASH 가 Null 인 데이터가 조회 결과에 포함되지 않았습니다.
그 이유는 다음과 같습니다.
NULL 규칙
- NULL 조건은 IS NULL, IS NOT NULL 로 처리해야 된다.
=
이나!=
<>
에 NULL을 붙이면 항상 FALSE 가 나온다. (Ex. DISCRHASH = NULL … FALSE)- 모든 DB 벤더에 상관없이 동일하게 적용 된다.
즉, DISCRHASH = NULL 의 결과가 FALSE 가 나오기 때문에 NULL 데이터가 조회 결과에서 제거되는 것입니다.
따라서, 조회 결과에 Null 데이터를 포함하고 싶으면 다음과 같이 쿼리를 수정하면 됩니다.
세 번째 쿼리
SELECT
SEQ,
NAME,
DISCRHASH
FROM RESERVATION
WHERE 1=1
AND NAME = 'John'
AND (DISCRHASH NOT IN 'BlahBlah' or DISCRHASH IS NULL)
조회 결과는 다음과 같습니다.
SEQ | NAME | DISCRHASH
2 John Null
3 John abc
정리
WHERE 조건에 Nullable 한 컬럼에 대한 조건이 들어가게되면 쿼리 결과에 Null 데이터를 포함할 것인지, 제외할 것인지의 여부에 따라 쿼리가 달라지게 됩니다. WHERE 조건에 들어가는 컬럼이 NOT NULL 제약조건을 가지고 있다면 위와 같은 걱정을 할 필요가 없어집니다.