NULL tem um tipo?


Respostas:


8

Oráculo:

O nullliteral não tem um tipo, mas

  1. null pode ser convertido para qualquer tipo, e isso pode ser necessário quando

    • chamando procedimentos ou funções sobrecarregados
    • controlar o tipo de retorno da decodefunção, por exemplo:

      select decode('A','B',to_char(null),'A','1') from dual;
      DECODE('A','B',TO_CHAR(NULL),'A','1')
      -------------------------------------
      1
      
      select decode('A','B',to_number(null),'A','1') from dual;
      DECODE('A','B',TO_NUMBER(NULL),'A','1')
      --------------------------------------- 
                                            1
    • controlando tipos de colunas de operadores de conjunto, como unionquando o primeiro bloco de consulta inclui umnull
  2. nullvalores armazenados no banco de dados sempre têm um tipo:

    create table t(n integer, s varchar(10));
    insert into t values(null, null);
    
    select decode('A','B',n,'A','1') from t; 
    DECODE('A','B',N,'A','1')
    -------------------------
                            1
    
    select decode('A','B',s,'A','1') from t;
    DECODE('A','B',S,'A','1')
    -------------------------
    1

2
+1 Por curiosidade, vamos tentar Selecionar NULL what_type_is_this from DUAL; É claro que esse não é um exemplo prático e útil e ainda não o testei, aprendi a usar elencos nesses casos.
bernd_k

6

SQL Server, int

SELECT NULL AS foo INTO dbo.bar
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'bar'
DROP TABLE dbo.bar

MySQL, binário (0)

CREATE TABLE mydb.foo (select NULL AS bar);
EXPLAIN mydb.foo;
DROP TABLE mydb.foo;

+1 isso é muito interessante - eu assumi que iria lançar um erro como ele faz no Oracle
Jack diz tentativa topanswers.xyz

4
Achado interessante. No entanto, isso mostra que esses mecanismos de banco de dados são padronizados para um tipo de dados ao criar tabelas dessa maneira, não necessariamente que NULL tenha um tipo nesses mecanismos. Por exemplo, esse erro sugere que o SQL Server realmente trata NULL como não digitado.
Nick Chammas

2
@ Nick select isnumeric(null)= 0 ... interessante
Fator Místico

5

Oracle, em certo sentido, é algum tipo de string .

Isso é o que o ADO Reader me diz. aqui está um script do Powershell:

[System.Reflection.Assembly]::LoadWithPartialName("System.Data.OracleClient") 
$ConnectionString = "Data Source=myTNS;User ID=myUSER;Password=myPassword" 
$conn=new-object System.Data.OracleClient.OracleConnection 
$conn.ConnectionString=$ConnectionString 
$conn.Open() 
$sql = "Select NULL xx from DUAL"
$cmd=new-object System.Data.OracleClient.OracleCommand($sql,$conn)

$r = $cmd.ExecuteReader()

$r.GetSchemaTable() | % { $_
}        

Isso dá

ColumnName               : XX
ColumnOrdinal            : 0
ColumnSize               : 0
NumericPrecision         : 0
NumericScale             : 0
DataType                 : System.String
ProviderType             : 22
IsLong                   : False
AllowDBNull              : True
IsAliased                : 
IsExpression             : 
IsKey                    : 
IsUnique                 : 
BaseSchemaName           : 
BaseTableName            : 
BaseColumnName           : 
ProviderSpecificDataType : System.Data.OracleClient.OracleString

Observe a linha

ProviderSpecificDataType: System.Data.OracleClient.OracleString


3

postgres:

create table foo as select null as bar;
WARNING:  column "bar" has type "unknown"
DETAIL:  Proceeding with relation creation anyway.

postgres=> \d foo

 Column |  Type   | Modifiers
--------+---------+-----------
 bar    | unknown |
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.