NULL tem um tipo?

14

Várias fontes (por exemplo , Wikipedia , PSOUG ) afirmam que o Oracle nullnão possui um tipo. Isso é verdade?

E quanto a outros RDBMSs?

Jack diz que tenta topanswers.xyz
fonte

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
Jack Douglas
fonte
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;
gbn
fonte
+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

bernd_k
fonte
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 |
Jack diz que tenta topanswers.xyz
fonte