NULL ha un tipo?


Risposte:


8

Oracolo:

Il nullletterale non ha un tipo, ma

  1. null può essere trasmesso a qualsiasi tipo e questo può essere necessario quando

    • chiamare procedure o funzioni sovraccariche
    • controllo del tipo di ritorno della decodefunzione, ad es .:

      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
    • controllare i tipi di colonna di operatori set come unionquando il primo blocco di query include anull
  2. nulli valori memorizzati nel database hanno sempre 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 Per curiosità proviamo Seleziona NULL what_type_is_this da DUAL; Naturalmente questo non è un esempio pratico utile e non l'ho ancora provato, ho imparato a usare i cast in questi casi.
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 è molto interessante -
suppongo

4
Trova interessante. Tuttavia, ciò dimostra che tali motori DB impostano automaticamente un tipo di dati durante la creazione di tabelle in quel modo, non necessariamente che NULL abbia un tipo in quei motori. Ad esempio, questo errore suggerisce che SQL Server in effetti considera NULL come non tipizzato.
Nick Chammas,

2
@Nick select isnumeric(null)= 0 ... interessante
Factor Mystic il

5

Oracle è in qualche modo un tipo di stringa .

Questo è ciò che mi dice ADO Reader. ecco uno script 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() | % { $_
}        

Questo 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

Nota 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 |
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.