Mysql에 마이그레이션에 대한 검증 쿼리를 만들다가 null값 조건 사용과 관련하여 미처 몰랐던 내용을 알게되어 공유 드립니다.
질문 : 아래 A/B의 SELECT 결과 값은 무엇 일까요
A. SELECT IF(NULL != 11, ‘True’, ‘False’);
B. SELECT IF(NULL != NULL , ‘True’, ‘False’);
결과
A. false
B. false이유를 찾아 보니..
To search for column values that are NULL, you cannot use an expr = NULL test. The following statement returns no rows, because expr = NULL is never true for any expression
– http://dev.mysql.com/doc/refman/5.6/en/working-with-null.html
– http://dev.mysql.com/doc/refman/5.6/en/problems-with-null.html
– http://stackoverflow.com/questions/3536670/mysql-selecting-rows-where-a-column-is-null
….원래 하고 싶던 일.
아래 쿼리를 수행하여, bl에 event_template_no가 11이 아닌 경우를 모두 찾아,
카운팅 하고 싶었음(실제로 105,106번 mt.ticket_no 의 결과에서는 bl.event_template_no가 모두 null값인 Row가 755490건이 존재함)
수행했던 Query 예)
SELECT COUNT(*)
FROM table_a AS mt INNER JOIN table_b AS bl ON mt.table_b_no=bl.table_b_no
WHERE mt.ticket_no IN(105,106)
AND bl.event_template_no != 11
수행 결과 = 0상기 3번의 내용을 참고해서 query 수정
A. OR 연산 사용
SELECT COUNT()
FROM table_a AS mt INNER JOIN table_b AS bl ON mt.table_b_no=bl.table_b_no
WHERE mt.ticket_no IN(105,106)
AND bl.event_template_no != 11 OR bl.event_template_no IS NULL
— 결과 잘 나옴.
B. IFNULL 사용.
SELECT COUNT()
FROM table_a AS mt INNER JOIN table_b AS bl ON mt.table_b_no=bl.table_b_no
WHERE mt.ticket_no IN(105,106)
AND IFNULL(bl.event_template_no,0) != 11