NULL có một loại không?


14

Nhiều nguồn khác nhau (ví dụ Wikipedia , PSOUG ) nói rằng Oracle nullkhông có loại. Điều này có đúng không?

Còn các RDBMS khác thì sao?

Câu trả lời:


8

Oracle:

Nghĩa nullđen không có một loại, nhưng

  1. null có thể được đúc thành bất kỳ loại nào, và điều này có thể cần thiết khi

    • gọi các thủ tục hoặc chức năng quá tải
    • kiểm soát kiểu trả về của decodehàm, vd:

      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
    • kiểm soát các loại cột của toán tử tập hợp như unionkhi khối truy vấn đầu tiên bao gồmnull
  2. nullCác giá trị được lưu trữ trong cơ sở dữ liệu luôn có một loại:

    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 Vì tò mò, hãy thử Chọn NULL what_type_is_this từ DUAL; Tất nhiên đây không phải là ví dụ hữu ích thực tế và tôi chưa thử, tôi đã học cách sử dụng phôi trong những trường hợp như vậy.
bernd_k

6

Máy chủ SQL, int

SELECT NULL AS foo INTO dbo.bar
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'bar'
DROP TABLE dbo.bar

MySQL, nhị phân (0)

CREATE TABLE mydb.foo (select NULL AS bar);
EXPLAIN mydb.foo;
DROP TABLE mydb.foo;

+1 điều đó rất thú vị - Tôi cho rằng sẽ gây ra lỗi giống như trên Oracle
Jack Douglas

4
Thú vị tìm thấy. Tuy nhiên, điều này cho thấy rằng các công cụ DB đó mặc định là kiểu dữ liệu khi tạo các bảng theo cách đó, không nhất thiết là NULL có một loại trong các công cụ đó. Ví dụ, lỗi này cho thấy rằng SQL Server thực sự coi NULL là chưa được xử lý.
Nick Chammas

2
@Nick select isnumeric(null)= 0 ... thú vị
Yếu tố huyền bí

5

Oracle là một số loại chuỗi .

Đó là những gì ADO Reader nói với tôi. đây là tập lệnh 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() | % { $_
}        

Điều đó mang lại

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

Lưu ý dòng

Nhà cung cấpSpecificDataType : System.Data.OracleClient.OracleString


3

bưu điện:

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 |
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.