2014-10-09 1 views
5

У меня есть эта таблица где NULL является значением NULL, а не пустая строка:Oracle NVL с пустой строкой

MYCOL 
-------- 
NULL 
example 

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

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

ответ

10

'' снова в 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 рекомендует не обрабатывать пустые строки так же, как и нули.

+0

Как прийти ' ''' 'является NULL'? Не '' '' пустая строка? – kmkaplan

+0

Потому что пустая строка NULL в Oracle. См. Мою демонстрацию в ответе. –

+0

@kmkaplan обновленный ответ с объяснением –

6

Потому что 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> 
0

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'));