Ao fazer uma inserção, uma string vazia é convertida em null:
insert into test (f) values ('');
Agora, há uma linha com f contendo um nulo.
Mas, quando consulto a tabela, não consigo usar '':
select * from test where f='';
no rows selected
Eu posso usar null:
select * from test where f is null;
____F_
NULL
Então... parece que a Oracle decidiu que strings vazias não podem ser usadas para inserção, mas elas permanecem strings vazias ao fazer consultas. Onde está a documentação sobre quando uma string vazia se torna nula e quando permanece uma string vazia?
Isso diz tudo:
SQL Fiddle
2 coisas:
1)
''
é convertido paraNULL
na inserção. Isso é coisa da OracleVARCHAR2
.2)
select * from test where f='';
está tentando fazerselect * from test where f=NULL
, que não está definido, e não retornará nada porqueNULL
não gosta do operador de igualdade. Você tem que usarIS NULL
ouIS NOT NULL
.Acrescentarei que o tipo de
CHAR
dados se comporta de maneira diferente porque é preenchido.Oracle trata '' e NULL da mesma forma. Ao inserir '', não há conversão de '' para NULL, apenas uma interpretação de '' como
NULL
da mesma forma que a palavra NULL é interpretada comoNULL
ou rtrim('a','a') é interpretada comoNULL
.Aqui está uma demonstração usando a tabela a seguir e inserir:
A inserção acima inseriu um valor NULL para c1. Você pode selecionar essa linha da seguinte maneira:
Quando você adiciona uma cláusula WHERE para comparar a igualdade e um dos valores comparados é NULL, o resultado sempre será desconhecido. Desconhecido será avaliado como falso, exceto que outras operações em um valor desconhecido produzirão valores desconhecidos. Todos os itens a seguir não retornam nenhuma linha porque as cláusulas WHERE contêm condições que nunca serão verdadeiras, independentemente dos dados.
O Oracle fornece uma sintaxe especial para recuperar linhas com uma coluna específica com valores nulos --
IS NULL
.Existem algumas condições nas quais o oracle compara NULLS tratando-os como iguais a outros valores NULL, como em instruções DECODE e em chaves compostas.
Mais informações podem ser encontradas na Referência da Linguagem SQL .
O Oracle RDBMS não está fazendo nenhuma diferença entre strings nulas e vazias; significando que não há transformação para converter uma string vazia em um valor nulo.
Posso entender que nenhum dos 2 contém informações.
Isso explica um pouco: