SQL
Redshift - BOOLEAN과 NULL 팁
터칭 데이터
2023. 11. 15. 22:45
BOOLEAN 타입 처리
flag = True와 flag is True는 동일한 표현입니다.
flag is True와 flag is not False는 동일한 표현이 아닙니다. True가 아닌 NULL도 not False이기 때문입니다.
SELECT *
FROM raw_data.boolean_test;

위와 같이 True가 2개, False가 2개, Null(None)이 1개 있는 테이블이 있습니다.
SELECT
COUNT(CASE WHEN flag = True THEN 1 END) true_cnt1,
COUNT(CASE WHEN flag is True THEN 1 END) true_cnt2,
COUNT(CASE WHEN flag is not False THEN 1 END) not_false_cnt
FROM raw_data.boolean_test;

flag = True는 2개, flag is True 역시 2개이지만 flag is not false는 True 2개 + Null 1개가 더해져 3개가 카운트됩니다.
NULL 비교
NULL 비교는 항상 IS 혹은 IS NOT으로 수행
NULL 비교를 = 혹은 != 혹은 <>으로 수행하면 잘못된 결과가 나옴
SELECT COUNT(1)
FROM raw_data.boolean_test
WHERE flag is NULL;

is로 올바르게 NULL을 비교하면 NULL의 갯수인 1이 제대로 카운트됩니다.
SELECT COUNT(1)
FROM raw_data.boolean_test
WHERE flag = NULL;

반면에 is나 is not이 아닌 연산자 =를 이용하면 NULL이 boolean_test 테이블에 분명히 1개가 있음에도 0으로 카운트합니다. 차라리 에러가 나면 빠르게 인지할 수 있지만 그렇지 않기 때문에 NULL을 비교할 때는 반드시 IS와 IS NOT을 사용하셔야 합니다.