¿NULL tiene un tipo?

14

Varias fuentes (por ejemplo , Wikipedia , PSOUG ) afirman que Oracle nullno tiene un tipo. ¿Es esto cierto?

¿Qué pasa con otros RDBMS?

Jack dice que intente topanswers.xyz
fuente

Respuestas:

8

Oráculo:

El nullliteral no tiene un tipo, pero

  1. null se puede lanzar a cualquier tipo, y esto puede ser necesario cuando

    • llamar a procedimientos o funciones sobrecargados
    • controlando el tipo de retorno de la decodefunción, por ejemplo:

      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
    • controlar los tipos de columna de operadores de conjuntos, como unioncuando el primer bloque de consulta incluye unnull
  2. nullLos valores almacenados en la base de datos siempre tienen un 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
fuente
2
+1 Por curiosidad intentemos Seleccionar NULL what_type_is_this de DUAL; Por supuesto, este no es un ejemplo práctico útil y aún no lo intenté, he aprendido a usar moldes en tales 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, binario (0)

CREATE TABLE mydb.foo (select NULL AS bar);
EXPLAIN mydb.foo;
DROP TABLE mydb.foo;
gbn
fuente
+1 es muy interesante: supuse que arrojaría un error como lo hace en Oracle
Jack dice que intente topanswers.xyz el
44
Interesante hallazgo. Sin embargo, esto muestra que esos motores de base de datos tienen un tipo de datos predeterminado al crear tablas de esa manera, no necesariamente que NULL tenga un tipo en esos motores. Por ejemplo, este error sugiere que SQL Server realmente trata NULL como sin tipo.
Nick Chammas
2
@Nick select isnumeric(null)= 0 ... interesante
Factor Mystic
5

Oracle es, en cierto sentido, un tipo de cadena .

Eso es lo que ADO Reader me dice. Aquí hay un script de 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() | % { $_
}        

Eso da

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

Note la linea

ProviderSpecificDataType: System.Data.OracleClient.OracleString

bernd_k
fuente
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 dice que intente topanswers.xyz
fuente