Краткое сравнение 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.