민서네집

다른 DBMS와 다른 Oracle의 NULL 본문

Database/Oracle

다른 DBMS와 다른 Oracle의 NULL

브라이언7 2013. 11. 23. 21:28

NULL에 관해서 Oracle에서는 다른 DBMS와 다른 점이 있다.


대부분의 프로그래밍 언어에서와는 달리, SQL에서는 NULL을 0이나 false 또는 빈 문자열과 다른 특별한 값으로 취급한다. 표준 SQL과 대부분의 데이터베이스 제품에서는 그렇다. 그러나 Oracle과 Sybase에서는 NULL이 길이가 0인 문자열과 동일하다.

- (옮긴이 주석) NULL을 문자열 데이터로 취급할 때 그렇다는 뜻이다. 숫자 타입이나 날짜 타입에서는 다른 DBMS와 마찬가지다.


NULL은 0과 같지 않다. 알지 못하는 값에 10을 더한다 해도 여전히 알지 못하는 값이다.

NULL은 길이가 0인 문자열과도 같지 않다. 표준 SQL에서는 어떤 문자열도 NULL과 연결하면 NULL이 된다. (Oracle과 Sybase는 예외)


또한 SQL-99 표준에서는 IS DISTINCT FROM이란 또 다른 비교연산자가 정의되었는데, 일반 비교 연산자인 <>와 비슷하게 동작한다. 다른 점은 피연산자가 NULL이더라도 항상 true 또는 false를 리턴한다는 것이다.


다음 두 쿼리는 동일하다.


SELECT * FROM Bugs WHERE assigned_to IS NULL OR assigned_to <> 1;


SELECT * FROM Bugs WHERE assigned_to IS DISTINCT FROM 1;


IS DISTINCT FROM 지원은 데이터베이스 제품마다 다르다. PostgreSQL, IBM DB2, Firebird는 이를 지원하지만, Oracle과 Microsoft SQL Server는 아직 지원하지 않는다. MySQL은 IS DISTINCT FROM처럼 동작하는 전용 연산자 <=>를 제공한다.


[출처] SQL AntiPatterns, 2011, 인사이트, 빌 카윈 지음 - 14장 모르는 것에 대한 두려움


Comments