2014-10-09 13 views
5

Mam tej tabeli gdzie null jest wartość NULL, nie łańcuchem pustym:Oracle NVL z pustym ciągiem

MYCOL 
-------- 
NULL 
example 

Dlaczego ta kwerenda nie zwrócić NULL wiersz?

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

Odpowiedz

10

'' znów NULL w Oracle, ponieważ Oracle nie obsługuje pustych ciągów podobnie jak inne języki wysokiego poziomu lub DBMS ..

trzeba spojrzeć na NULL/pusty ciąg używając IS NULL lub IS NOT NULL

Żaden inny operator relacyjny nie działa przeciwko NULL, ale jest poprawny pod względem składniowym. SQLFiddle Demo

To musi być

select * from example_so where mycol IS NULL 

EDIT: Zgodnie Docs

Oracle Database obecnie traktuje wartość znaków o długości zero za nieważną. Jednak może to nie być prawdą w przyszłych wersjach , a firma Oracle zaleca, aby nie traktować pustych ciągów takich samych, jak wartości null.

+0

Jak to ' ''' 'NULL' jest? Czy nie jest pustym łańcuchem? – kmkaplan

+0

Ponieważ pusty łańcuch ma wartość NULL w Oracle. Zobacz moje demo w odpowiedzi. –

+0

@kmkaplan zaktualizowana odpowiedź z wyjaśnieniem –

6

Ponieważ NULL = NULL jest po prostu nieznany. Może trzecie państwo? Nie jest to ani TRUE ani FALSE.

Oracle uważa PUSTE STRING za NULL.

nvl(mycol, '') nie ma sensu, ponieważ przywracasz NULL z powrotem do NULL i porównujesz go ponownie z 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

wybierz * z przyklad_so gdzie nvl (mycol, '') = '';

NVL (Mycol, '') będzie powodowało jako NULL i po porównaniu NULL z pustym ciągiem cant być porównywane

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