NULL มีชนิดหรือไม่?


คำตอบ:


8

ออราเคิล:

nullตัวอักษรไม่ได้มีประเภท แต่

  1. null สามารถถูกโยนในรูปแบบใดก็ได้และสิ่งนี้อาจจำเป็นเมื่อ

    • การเรียกโพรซีเดอร์หรือฟังก์ชันที่โอเวอร์โหลด
    • การควบคุมชนิดส่งคืนของdecodeฟังก์ชันเช่น:

      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
    • การควบคุมประเภทคอลัมน์ของชุดตัวดำเนินการเช่นunionเมื่อคิวรีบล็อกแรกประกอบด้วยnull
  2. nullค่าที่เก็บไว้ในฐานข้อมูลจะมีประเภท:

    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 เพื่อความอยากรู้ลองเลือก NULL what_type_is_this จาก DUAL; แน่นอนว่านี่ไม่ใช่ตัวอย่างที่เป็นประโยชน์และฉันยังไม่ได้ลองเลยฉันได้เรียนรู้ที่จะใช้การปลดเปลื้องในกรณีเช่นนี้
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, ไบนารี่ (0)

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

+1 น่าสนใจมาก - ฉันสันนิษฐานว่าจะทำให้เกิดข้อผิดพลาดเหมือนใน Oracle
Jack บอกว่าลอง topanswers.xyz

4
ค้นหาที่น่าสนใจ อย่างไรก็ตามสิ่งนี้แสดงให้เห็นว่าเอ็นจิน DB เหล่านั้นใช้ค่าเริ่มต้นกับประเภทข้อมูลเมื่อสร้างตารางด้วยวิธีนั้นไม่จำเป็นว่า NULL จะมีประเภทในเอนจิ้นเหล่านั้น ตัวอย่างเช่นข้อผิดพลาดนี้ชี้ให้เห็นว่า SQL Server จะถือว่า NULL เป็น untyped
Nick Chammas

2
@Nick select isnumeric(null)= 0 ... น่าสนใจ
Factor Mystic

5

Oracle เป็นบางประเภทสตริงบางอย่าง

นั่นคือสิ่งที่ ADO Reader บอกฉัน นี่คือสคริปต์ 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() | % { $_
}        

ที่ให้

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

จดบันทึกบรรทัด

ProviderSpecificDataType: System.Data.OracleClient.OracleString


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.