DB 조건절에 Null 허용 컬럼 사용 시 주의할 점

Dope
Webdev TechBlog
Published in
3 min readSep 8, 2021

서론

쿼리 조건절에 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 제약조건을 가지고 있다면 위와 같은 걱정을 할 필요가 없어집니다.

--

--

Dope
Webdev TechBlog

Developer who is trying to become a clean coder.