Oracle NVL с пустой строкой

У меня есть эта таблица, где NULL - это значение NULL, а не строка NULL:

MYCOL
--------
NULL
example

Почему этот запрос не возвращает строку NULL?

select * from example_so where nvl(mycol, '') = '';

person kmkaplan    schedule 09.10.2014    source источник


Ответы (3)


'' снова NULL в Oracle, потому что Oracle не поддерживает пустые строки, как другие языки высокого уровня или СУБД.

Вам нужно искать NULL/пустую строку, используя IS NULL или IS NOT NULL

Ни один другой реляционный оператор не работает с NULL, хотя он синтаксически допустим. демонстрация SQLFiddle

Должно быть,

select * from example_so where mycol IS NULL

EDIT: Согласно документам

В настоящее время Oracle Database обрабатывает символьное значение нулевой длины как null. Однако это может измениться в будущих выпусках, и Oracle рекомендует не обрабатывать пустые строки так же, как пустые значения.

person Maheswaran Ravisankar    schedule 09.10.2014
comment
Почему '' является NULL? Разве '' не пустая строка? - person kmkaplan; 09.10.2014
comment
Потому что пустая строка в Oracle равна NULL. Смотрите мою демонстрацию в ответе. - person Lalit Kumar B; 09.10.2014
comment
Странно, я не могу найти это в документации. - person kmkaplan; 09.10.2014
comment
Я принял ваш ответ, поскольку он отвечает на мой вопрос. Но обратите внимание, что операторы отношения do работают с NULL. Хотя это довольно обидчиво. - person kmkaplan; 09.10.2014
comment
@kmkaplan добавил немного sql в ссылку на скрипку здесь.. в качестве демонстрации.. SQL работает успешно , но результатом выражения будет UNKNOWN .. документы, на которые я ссылался здесь, показывают то же самое. - person Maheswaran Ravisankar; 09.10.2014
comment
AND и OR можно использовать с NULL для получения полезных (не NULL) результатов. - person kmkaplan; 09.10.2014
comment
OR подавляет любое использование индекса. - person Lalit Kumar B; 09.10.2014
comment
Самая лицемерная часть документации, которую я когда-либо видел. По сути говоря, вы не должны рассматривать пустую строку как NULL. Но БД делает. Но может измениться в будущем. Но мы не знаем когда. И вы не можете контролировать или изменить поведение. Но не относитесь к ним одинаково. - person cautionbug; 22.11.2017

Потому что NULL = NULL просто неизвестно. Может быть, третье состояние? Это не TRUE и не FALSE.

Oracle считает ПУСТУЮ СТРОКУ NULL.

nvl(mycol, '') не имеет никакого смысла, так как вы возвращаете NULL к NULL и снова сравниваете его с NULL.

SQL> WITH DATA AS(
  2  SELECT 1 val, 'NULL' str FROM dual UNION ALL
  3  SELECT 2, NULL str FROM dual UNION ALL
  4  SELECT 3, '' str FROM dual UNION ALL
  5  SELECT 4, 'some value' str FROM dual)
  6  SELECT val, NVL(str, 'THIS IS NULL') FROM data WHERE str IS NULL
  7  /

       VAL NVL(STR,'THI
---------- ------------
         2 THIS IS NULL
         3 THIS IS NULL

SQL>
person Lalit Kumar B    schedule 09.10.2014

выберите * из example_so, где nvl(mycol, '') = '';

nvl(mycol, '') будет иметь значение NULL, и при сравнении NULL с пустой строкой сравнение невозможно

create table t(id varchar2(2));
insert into t values (nvl(null,''));   <------ this will insert NULL
insert into t values (nvl(null,'et'));
person user3380585    schedule 09.10.2014