Hat NULL einen Typ?


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

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;

+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


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 |
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.