AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 49744
Accepted
kainaw
kainaw
Asked: 2013-09-13 07:08:26 +0800 CST2013-09-13 07:08:26 +0800 CST 2013-09-13 07:08:26 +0800 CST

A string vazia do Oracle é convertida em null

  • 772

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?

oracle null
  • 4 4 respostas
  • 48256 Views

4 respostas

  • Voted
  1. Best Answer
    Philᵀᴹ
    2013-09-13T11:51:56+08:002013-09-13T11:51:56+08:00

    Isso diz tudo:

    select NVL('','it is null') as value
    from dual;
    

    SQL Fiddle

    2 coisas:

    1) ''é convertido para NULLna inserção. Isso é coisa da Oracle VARCHAR2.

    2) select * from test where f='';está tentando fazer select * from test where f=NULL, que não está definido, e não retornará nada porque NULLnão gosta do operador de igualdade. Você tem que usar IS NULLou IS NOT NULL.

    Acrescentarei que o tipo de CHARdados se comporta de maneira diferente porque é preenchido.

    • 10
  2. Leigh Riffel
    2013-09-13T11:41:55+08:002013-09-13T11:41:55+08:00

    Oracle trata '' e NULL da mesma forma. Ao inserir '', não há conversão de '' para NULL, apenas uma interpretação de '' como NULLda mesma forma que a palavra NULL é interpretada como NULLou rtrim('a','a') é interpretada como NULL.

    Aqui está uma demonstração usando a tabela a seguir e inserir:

    drop table t1;
    create table t1 (c1 varchar2(10));
    insert into t1 (c1) values ('');
    

    A inserção acima inseriu um valor NULL para c1. Você pode selecionar essa linha da seguinte maneira:

    SELECT c1 FROM t1;
    

    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.

    SELECT c1 FROM t1 WHERE c1 = '';
    SELECT c1 FROM t1 WHERE c1 = NULL;
    SELECT c1 FROM t1 WHERE '' = '';
    SELECT c1 FROM t1 WHERE NULL = NULL;
    

    O Oracle fornece uma sintaxe especial para recuperar linhas com uma coluna específica com valores nulos -- IS NULL.

    SELECT c1 FROM t1 WHERE c1 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 .

    • 7
  3. Nicolas Durand
    2013-09-13T07:15:55+08:002013-09-13T07:15:55+08:00

    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.

    • -1
  4. user107450
    2016-10-06T23:11:54+08:002016-10-06T23:11:54+08:00

    Isso explica um pouco:

    create table t1 (c1 char(1),
                     c2 char(3),
                     c3 varchar2(10));
    
    
    insert into t1 values ('','','');
    insert into t1 values ('a','a','a');
    
    declare 
    v1 char(1);
    begin
    v1 := '';
    insert into t1 values (v1,v1,v1);
    end;
    
    select * from t1;
    
    select count(c1) from t1;
    select count(c2) from t1;
    select count(c3) from t1;
    
    select length(c1), length(c2), length(c3) from t1;
    
    • -3

relate perguntas

  • Interface sqlplus confortável? [fechado]

  • Como encontrar as instruções SQL mais recentes no banco de dados?

  • Como posso consultar nomes usando expressões regulares?

  • NULL ou NOT NULL por padrão?

  • Quando usar NULL e quando usar uma string vazia?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Conceder acesso a todas as tabelas para um usuário

    • 5 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve