비교 연산자(!=)와 NULL, 발생 가능한 실수

비교 연산자에서는 NULL이 배제된다.
(반면 논리 연산자에서는 NULL이 배제되지 않는다.)

 

가령,

Query 1.

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE A.컬럼1 = ‘값1’ OR B.컬럼2 = ‘값2’

 

위 Query 1. 결과는 아래 Query 2.  결과와 일치하지 않는다.

 

Query 2.

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE A.컬럼1 != ‘값1’ AND B.컬럼2 = ‘값2’

UNION

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE A.컬럼1 = ‘값1’ AND B.컬럼2 != ‘값2’

(A, B의 컬럼 차수 및 데이터형은 일치한다고 가정한다)

 

A.컬럼1 과 B.컬럼2 의 NULL 값이 결과에서 배제되기 때문에
해당 컬럼의 NULL 존재 여부에 따라서 Query 2. 의 결과 수가 Query 1.보다 적을 수도 있다.

비교 연산자에서 NULL이 배제된다는 점을 고려했을 때,
Query1 과 동일한 결과를 도출하기 위해서 올바른 Query는 다음과 같다.

 

Query 3.

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE A.컬럼1 = ‘값1’ AND (B.컬럼2 != ‘값2’ OR B.컬럼2 IS NULL)

UNION

SELECT *
FROM A FULL OUTER JOIN B ON ~
WHERE (A.컬럼1! = ‘값1’ OR A.컬럼1 IS NULL) AND B.컬럼2 = ‘값2’

(A, B의 컬럼 차수 및 데이터형은 일치한다고 가정한다)

 

결론 : 비교 연산자와 논리 연산자를 함께 사용할 경우, NULL 처리에 유의하자!

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google photo

Google의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중