У меня есть эта таблица, где NULL - это значение NULL
, а не строка NULL:
MYCOL
--------
NULL
example
Почему этот запрос не возвращает строку NULL
?
select * from example_so where nvl(mycol, '') = '';
У меня есть эта таблица, где NULL - это значение NULL
, а не строка NULL:
MYCOL
--------
NULL
example
Почему этот запрос не возвращает строку NULL
?
select * from example_so where nvl(mycol, '') = '';
''
снова NULL
в Oracle, потому что Oracle не поддерживает пустые строки, как другие языки высокого уровня или СУБД.
Вам нужно искать NULL/пустую строку, используя IS NULL
или IS NOT NULL
Ни один другой реляционный оператор не работает с NULL
, хотя он синтаксически допустим. демонстрация SQLFiddle
Должно быть,
select * from example_so where mycol IS NULL
EDIT: Согласно документам
В настоящее время Oracle Database обрабатывает символьное значение нулевой длины как null. Однако это может измениться в будущих выпусках, и Oracle рекомендует не обрабатывать пустые строки так же, как пустые значения.
''
является NULL
? Разве ''
не пустая строка?
- person kmkaplan; 09.10.2014
NULL
. Хотя это довольно обидчиво.
- person kmkaplan; 09.10.2014
UNKNOWN
.. документы, на которые я ссылался здесь, показывают то же самое.
- person Maheswaran Ravisankar; 09.10.2014
AND
и OR
можно использовать с NULL
для получения полезных (не NULL
) результатов.
- person kmkaplan; 09.10.2014
OR
подавляет любое использование индекса.
- person Lalit Kumar B; 09.10.2014
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>
выберите * из 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'));