Hat NULL einen Typ?

14

Verschiedene Quellen (zB Wikipedia , PSOUG ) geben an, dass Oracle nullkeinen Typ hat. Ist das wahr?

Was ist mit anderen RDBMSs?

Jack Douglas
quelle

Antworten:

8

Orakel:

Das nullLiteral hat keinen Typ, aber

  1. null kann auf jeden Typ gegossen werden, und dies kann erforderlich sein, wenn

    • Aufrufen überladener Prozeduren oder Funktionen
    • Steuerung des Rückgabetyps der decodeFunktion, zB:

      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
    • Steuern von Spaltentypen von Mengenoperatoren, beispielsweise unionwenn der erste Abfrageblock a enthältnull
  2. nullIn der Datenbank gespeicherte Werte haben immer einen Typ:

    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
quelle
2
+1 Aus Neugier versuchen wir, NULL zu wählen, welcher_Typ_ist_dies aus DUAL; Natürlich ist dies kein praktisches nützliches Beispiel und ich habe es noch nicht ausprobiert, ich habe gelernt, in solchen Fällen mit Abgüssen umzugehen.
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är (0)

CREATE TABLE mydb.foo (select NULL AS bar);
EXPLAIN mydb.foo;
DROP TABLE mydb.foo;
gbn
quelle
+1 das ist sehr interessant - ich nahm an, dass dies einen Fehler wie bei Oracle auslösen würde
Jack Douglas
4
Interessante Entdeckung. Dies zeigt jedoch, dass diese DB-Engines beim Erstellen von Tabellen standardmäßig einen Datentyp verwenden, nicht unbedingt, dass NULL einen Typ in diesen Engines hat. Dieser Fehler deutet beispielsweise darauf hin, dass SQL Server NULL tatsächlich als untypisiert behandelt.
Nick Chammas
2
@Nick select isnumeric(null)= 0 ... interessant
Factor Mystic
5

Oracle ist in gewissem Sinne ein String- Typ.

Das sagt mir ADO Reader. Hier ist ein Powershell-Skript:

[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() | % { $_
}        

Das gibt

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

Beachten Sie die Linie

ProviderSpecificDataType: System.Data.OracleClient.OracleString

bernd_k
quelle
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 Douglas
quelle