NULL в ORACLE и как с ним можно подружиться?

NULL в ORACLE и как с ним можно подружиться?
Андрей Васенин

Андрей Васенин

Автор статьи. Сфера интересов: ИТ-специалист (программирование, администрирование, DBA). Кандидат экономических наук. Подробнее .

Всегда и все ли мы помним работая с SQL кодом в СУБД Oracle, что поле со значением NULL никогда не будет равно полю с тем же значением? Давайте изучим проблему и попробуем найти простой выход.

SQL> create table my_table (a int, b int);
Table created.

SQL> insert into my_table values (1, 1) ;
1 row created.

SQL> insert into my_table values (1, NULL);
1 row created.

SQL> insert into my_table values (NULL, 1) ;
1 row created.

SQL> insert into my_table values (NULL, NULL);
1 row created.

SQL> insert into my_table values (NULL, NULL);
1 row created.

SQL> insert into my_table values (NULL, NULL);
1 row created.

SQL> insert into my_table values (NULL, NULL);
1 row created.

SQL> select rownum,a,b from my_table where a=b;
    ROWNUM          A          B
---------- ---------- ----------
         1          1          1

Как видим, выбирается только одна запись, хотя в таблице есть 4 записи, у которых и первое и второе поле имеют одинаковое значение – NULL. Поэтому попробуем использовать следующие варианты:

SQL> select rownum,a,b  from my_table  WHERE NVL (a, 0) = NVL (b, 0);
    ROWNUM          A          B
---------- ---------- ----------
         1          1          1
         2
         3
         4
         5


SQL> select rownum,a,b  from my_table  WHERE DECODE (a, b, 'YES', 'NO') = 'YES';
    ROWNUM          A          B
---------- ---------- ----------
         1          1          1
         2
         3
         4
         5


SQL> select rownum,a,b  from my_table  WHERE (a = b OR (a IS NULL AND b IS NULL));
    ROWNUM          A          B
---------- ---------- ----------
         1          1          1
         2
         3
         4
         5


SQL> select rownum,a,b  from my_table WHERE sys_op_map_nonnull(a) = sys_op_map_nonnull(b);
    ROWNUM          A          B
---------- ---------- ----------
         1          1          1
         2
         3
         4
         5

Ну, вот и все. Надеюсь примеры были познавательными и поучительными? Осталось главное - как об этом всём не забыть? ;-)

Вас заинтересует / Intresting for you:

Oracle и непроцедурный доступ ...
Oracle и непроцедурный доступ ... 8522 просмотров Antoni Tue, 21 Nov 2017, 13:32:50
Listener Oracle
Listener Oracle 33230 просмотров Stas Belkov Tue, 21 Nov 2017, 13:18:05
Язык SQL в Oracle
Язык SQL в Oracle 4293 просмотров Ирина Светлова Tue, 21 Nov 2017, 13:26:01
Использование памяти PGA и UGA...
Использование памяти PGA и UGA... 6382 просмотров Денис Tue, 21 Nov 2017, 13:31:33
Войдите чтобы комментировать

Fasenger аватар
Fasenger ответил в теме #9664 3 года 9 мес. назад
Круто! На примерчиках действительно легко понять как работает Null в операторах SQL под базу данных Oracle