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

dbstalker, 23 сентября

Всегда и все ли мы помним, что поле со значением 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

Ну, вот и все. Только как об этом не забыть?

1 комментарий

Прокоментировать

Юрий
25 марта 2013 г. в 13:46

Не все запросы отработают корректно(
например, в первом:

select rownum,a,b from my_table WHERE NVL (a, 0) = NVL (b, 0);

выдаст неправильный рез-т если a=0, b = NULL

 

Новый комментарий

Я не спамер: введите суму 3+5



 

От авторов блога

О Блоге - прочитай перед началом.

Задать вопрос и получить ответ - уже решено 94 вопросов

Глоссарий - список терминов и сокращений


 
 

Бизнес форум

Последние темы:

Нужен поставщик Дропшиппинг
10 декабря, 1 ответа
КИНО КАФЕ!!!!!!!!!!!!!!!!
10 декабря, 1 ответа