NULL a-t-il un type?

14

Diverses sources (par exemple Wikipedia , PSOUG ) indiquent qu'Oracle nulln'a pas de type. Est-ce vrai?

Qu'en est-il des autres SGBDR?

Jack dit d'essayer topanswers.xyz
la source

Réponses:

8

Oracle:

Le nulllittéral n'a pas de type, mais

  1. null peut être converti en n'importe quel type, et cela peut être nécessaire lorsque

    • appel de procédures ou fonctions surchargées
    • contrôler le type de retour de la decodefonction, par exemple:

      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
    • contrôler les types de colonnes d'opérateurs d'ensemble, comme unionlorsque le premier bloc de requête comprend unnull
  2. nullles valeurs stockées dans la base de données ont toujours un type:

    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
la source
2
+1 Par curiosité, essayons de sélectionner NULL what_type_is_this de DUAL; Bien sûr, ce n'est pas un exemple pratique utile et je ne l'ai pas encore essayé, j'ai appris à utiliser des moulages dans de tels cas.
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, binaire (0)

CREATE TABLE mydb.foo (select NULL AS bar);
EXPLAIN mydb.foo;
DROP TABLE mydb.foo;
gbn
la source
+1 c'est très intéressant - j'ai supposé que cela lancerait une erreur comme sur Oracle
Jack dit essayer topanswers.xyz
4
Trouvaille intéressante. Cependant, cela montre que ces moteurs de base de données utilisent par défaut un type de données lors de la création de tables de cette manière, pas nécessairement que NULL a un type dans ces moteurs. Par exemple, cette erreur suggère que SQL Server traite effectivement NULL comme non typé.
Nick Chammas
2
@Nick select isnumeric(null)= 0 ... intéressant
Factor Mystic
5

Oracle est en quelque sorte un type de chaîne .

C'est ce que ADO Reader me dit. voici un 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() | % { $_
}        

Ça donne

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

Notez la ligne

ProviderSpecificDataType: System.Data.OracleClient.OracleString

bernd_k
la source
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 dit d'essayer topanswers.xyz
la source