Всегда и все ли мы помним работая с 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
Ну, вот и все. Надеюсь примеры были познавательными и поучительными? Осталось главное - как об этом всём не забыть? ;-)