Краткое сравнение Oracle SQL и ANSI SQL - NULL значения

ОГЛАВЛЕНИЕ

NULL значения

Начнем сравнение с реализации NULL-значений в ANSI SQL и Oracle SQL. Согласно ANSI все типы данных должны поддерживать неопределенные или NULL значения. Oracle в полной мере поддерживает это правило для всех типов, за исключением символьных. Для любых символьных данных пустая строка интерпретируется как NULL, например два оператора Oracle SQL:

   INSERT INTO TEST(COL1) VALUES(NULL) и
INSERT INTO TEST(COL1) VALUES('')

полностью идентичны и вставят в таблицу значения NULL, а не пустые строки.

В Oracle вообще нельзя вставить пустую строку, так как она будет рассматриваться как NULL. Это отклонение особенно актуально при сравнении строк, например пусть есть следующая таблица:

TEST
COL1 COL2
1 '' 'Str1'
2 'a' 'Str2'

тогда оператор SELECT * FROM TEST WHERE COL1=''в Oracle будет интерпретироваться как SELECT * FROM TEST WHERE COL=NULL и не вернет НИОДНОЙ строчки, в тоже время в ANSI SQL данный оператор вернет первую строку.

Оператор SELECT * FROM TEST WHERE COL1<>''в Oracle будет интерпретироваться как SELECT * FROM TEST WHERE COL<>NULL и также не вернет НИОДНОЙ строчки, в ANSI SQL данный оператор вернет вторую строку.

Чтобы операторы отработал корректно его следует заменить на:

SELECT * FROM TEST WHERE COL1 IS NULL и
SELECT * FROM TEST WHERE COL1 IS NOT NULL.

Таким образом при сравнении величины с пустой строкой в Oracle следует пользоваться предложениями IS NULL и IS NOT NULL.