null 데이터가 WHERE 조건 비교 검색에서 취득되지 않는 이유

Oracle DB

null값의 입력

오라클 데이터베이스는 NULL과 ”(홑따옴표, 싱글쿼테이션)를 동일시합니다. 하지만 WHERE문과 같이, 값을 비교하는 경우에는 IS NULL / IS NOT NULL 만 사용할 수 있습니다.

예시
SELECT * FROM 테이블명 WHERE 컬럼명 IS NULL;
SELECT * FROM 테이블명 WHERE 컬럼명 IS NOT NULL;
INSERT INTO 테이블명 (컬럼명) VALUES (NULL);
INSERT INTO 테이블명 (컬럼명) VALUES ();

null값의 입력 – 자주 저지르는 실수

아래의 예제 테이블을 기준으로 B1가 null이 들어있는 데이터를 출력하거나 null값과 비교한 결과를 출력하려고 합니다.

SQL> select * from test;
A1         A2         B1
--------   --------   --------
test1      test2
test3      test4
test5      test6      test7
test8      test9      test10

— ※ null값이 포함된 데이터가 정상적으로 출력된 경우

SQL> select * from test where B1 is null;
A1         A2         B1
--------   --------   --------
test1      test2
test3      test4

— 1. null 대신 공백 혹은 ”을 입력했을 경우

SQL> select * from test where B1 is ;
select * from test where B1 is
*
ERROR at line 1:
ORA-00908: missing NULL keyword

SQL> select * from test where B1 is '';
select * from test where B1 is ''
*
ERROR at line 1:
ORA-00908: missing NULL keyword

앞서 설명한 대로 WHERE문에서는 ”를 null 대신으로 사용할 수 없습니다. INSERT문에서는 ”로 null값을 입력하는 것이 가능합니다.

— 2. null의 크고 작음을 비교할 경우

SQL> select * from test where B1 = null;
no rows selected
SQL> select * from test where B1 > null;
no rows selected
SQL> select * from test where B1 < null;
no rows selected

null은 비교가 가능한 숫자 혹은 문자열이 아니기 때문에 크고 작음을 판단할 수 없습니다.

— 3. ”과 함께 입력했을 경우

SQL> select * from test where B1 is 'null';
select * from test where B1 is 'null'
*
ERROR at line 1:
ORA-00908: missing NULL keyword

SQL> select * from test where B1 = 'null';
no rows selected

전자는 에러가 발생했지만 후자는 에러가 발생하지 않고 대상 데이터가 없다는 결과를 출력합니다. 이유는 ‘null’처럼 홑따옴표로 null을 감쌌을 경우 문자열로 인식하기 때문입니다. null값과 ‘null’이라는 문자열이 들어간 데이터는 다른 것이기 때문에 헷갈리기 쉽습니다. null 값을 검색 대상으로써 데이터를 출력하기 위해서는 반드시 IS NULL / IS NOT NULL만 사용해야한다는 것을 기억해두셔야 합니다.

제목과 URL을 복사했습니다