Apakah NULL memiliki tipe?

14

Berbagai sumber (misalnya Wikipedia , PSOUG ) menyatakan bahwa Oracle nulltidak memiliki tipe. Apakah ini benar?

Bagaimana dengan RDBMS lainnya?

Jack mengatakan coba topanswers.xyz
sumber

Jawaban:

8

Peramal:

The nullliteral tidak memiliki jenis, tapi

  1. null dapat dilemparkan ke jenis apa pun, dan ini mungkin perlu saat

    • memanggil prosedur atau fungsi yang kelebihan beban
    • mengendalikan jenis pengembalian decodefungsi, misalnya:

      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
    • mengendalikan tipe kolom dari operator yang diatur seperti unionketika blok permintaan pertama menyertakan anull
  2. nullnilai yang disimpan dalam database selalu memiliki tipe:

    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
sumber
2
+1 Untuk rasa ingin tahu, mari kita coba Pilih NULL what_type_is_ini dari DUAL; Tentu saja ini bukan contoh praktis yang berguna dan saya belum mencobanya, saya telah belajar menggunakan gips dalam kasus tersebut.
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, binary (0)

CREATE TABLE mydb.foo (select NULL AS bar);
EXPLAIN mydb.foo;
DROP TABLE mydb.foo;
gbn
sumber
+1 itu sangat menarik - saya berasumsi akan melakukan kesalahan seperti pada Oracle
Jack mengatakan coba topanswers.xyz
4
Temuan yang menarik. Namun, ini menunjukkan bahwa mesin DB default untuk tipe data saat membuat tabel dengan cara itu, tidak harus bahwa NULL memiliki tipe di mesin tersebut. Misalnya, kesalahan ini menunjukkan bahwa SQL Server memang memperlakukan NULL sebagai tidak diketik.
Nick Chammas
2
@Nick select isnumeric(null)= 0 ... menarik
Factor Mystic
5

Oracle dalam beberapa hal beberapa tipe string .

Itulah yang dikatakan Pembaca ADO kepada saya. di sini adalah 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() | % { $_
}        

Itu memberi

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

Perhatikan barisnya

PenyediaSpecificDataType: System.Data.OracleClient.OracleString

bernd_k
sumber
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 mengatakan coba topanswers.xyz
sumber