У меня есть эта таблица где NULL является значением NULL
, а не пустая строка:Oracle NVL с пустой строкой
MYCOL
--------
NULL
example
Почему этот запрос не вернуть NULL
строку?
select * from example_so where nvl(mycol, '') = '';
У меня есть эта таблица где NULL является значением NULL
, а не пустая строка:Oracle NVL с пустой строкой
MYCOL
--------
NULL
example
Почему этот запрос не вернуть NULL
строку?
select * from example_so where nvl(mycol, '') = '';
''
снова в Oracle NULL
, потому что Oracle не поддерживает пустые строки, как и другие языки высокого уровня или СУБД ..
Вы должны искать NULL/пустая строка, используя IS NULL
или IS NOT NULL
Никакой другой реляционный оператор не работает с NULL
, хотя он синтаксически действителен. SQLFiddle Demo
Это должно быть,
select * from example_so where mycol IS NULL
EDIT: Согласно Docs
Oracle Database в настоящее время обрабатывает значение символа с длиной нуля как нуль. Однако это не может продолжаться в будущих версиях , и Oracle рекомендует не обрабатывать пустые строки так же, как и нули.
Потому что NULL = NULL
просто неизвестен. Возможно, третье государство? Это не TRUE
, ни FALSE
.
Oracle рассматривает EMPTY STRING как 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>
select * from 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'));
Как прийти ' ''' 'является NULL'? Не '' '' пустая строка? – kmkaplan
Потому что пустая строка NULL в Oracle. См. Мою демонстрацию в ответе. –
@kmkaplan обновленный ответ с объяснением –