¿NULL tiene un tipo?


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

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;

+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


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 |
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.