你真的理解T-sql中的NULL嗎?
NULL不表示什麼?
NULL不表示空字串,不表示0。
NULL表示什麼?
NULL表示不知道是什麼,就是說NULL的原意是不知道是什麼,表示可能什麼都是。
NULL與?做比較
PRINT (Case When NULL!='Value' Then 'true' else 'false' end)
PRINT (Case When NULL!=NULL Then 'true' else 'false' end)
PRINT (Case When NULL=NULL Then 'true' else 'false' end)
大家猜一下上面的4行表示式會返回什麼?,答案在下面
false
false
false
false
為什麼會有這樣的結果呢?
答案在MSDN上:
A value of NULL indicates that the value is unknown. A value of NULL is different from an empty or zero value. No two null values are equal. Comparisons between two null values, or between a NULL and any other value, return
unknown because the value of each NULL is unknown.
既然如此,那我們應該怎樣與NULL值做比較呢,答案是用ISNULL函式,T-sql中ISNULL函式有兩個引數,第一個引數是要檢查是否為NULL的表示式,第二個引數是如果要檢查表示式為NULL時函式的返回值。
NULL與其他數值做運算
PRINT 1 + NULL;
PRINT 'yukaizhao' + NULL;
DECLARE @d datetime;
SET @d = GETDATE();
PRINT @d + NULL;
大家猜一下上面的語句會PRINT出來什麼?
答案是什麼都沒有,所有運算都和PRINT NULL是相同結果,結果還是NULL
NULL值與索引
如果一個列中有NULL值,那麼不可以在這個列上建唯一索引,可以建立非唯一索引;但是如果一個欄位有很多行有NULL值,那麼在這個欄位上建索引效果不佳。所以建議不在在一個頻繁出現NULL值的欄位上建索引(有待證實)。
NULL與排序
NULL參與排序時總是作為最小值存在,即ORDER BY COL ASC時COL為NULL的行在最前面,反之在最後面。
附註:t-sql中三個關於NULL的函式:
ISNULL(check_expression, replacement_value)
check_expression 與 replacement_value 資料型別必須一致
如果 check_expression 為 NULL,則返回 replacement_value
如果 check_expression 不為 NULL,則返回 check_expression
NULLIF 用於檢查兩個表示式,語法:
NULLIF(expression, expression)
如果兩個 expression 相等,則返回 NULL,該 NULL 為第一個 expression 的資料型別
如果兩個 expression 不相等,則返回第一個 expression
COALESCE()函式可以接受一系列的值,如果列表中所有項都為空(null),那麼只使用一個值。然後,它將返回第一個非空值。這一技巧描述了創造性使用SQL Server 中COALESCE()函式的兩種方法。
相關文章
- 你真的理解this嗎
- 你真的理解==和===嗎
- 你真的理解setState嗎?
- 你真的理解 Spring Boot 專案中的 parent 嗎?Spring Boot
- 你真的理解Python中的賦值、傳參嗎?Python賦值
- 你真的理解 getLocationInWindow 了嗎?
- C++中的i++和++i你真的理解嗎?C++
- 你真的理解 flex 佈局嗎?Flex
- 你真的理解JS的繼承了嗎?JS繼承
- 你真的知道typeof null的結果為什麼是‘object‘嗎?NullObject
- 你真的理解什麼是死鎖嗎?
- 高併發,你真的理解透徹了嗎?
- 【架構設計】你真的理解軟體設計中的SOLID原則嗎?架構Solid
- 你真的理解javascript中的預編譯麼?JavaScript編譯
- 你以為的中臺真的是中臺嗎?
- 你真的理解@import和link引入樣式的區別嗎Import
- 你真的理解反向傳播嗎?面試必備反向傳播面試
- 你真的理解函數語言程式設計嗎?函數程式設計
- 你真的理解 Webpack?Web
- TestNg中的斷言你真的瞭解嗎
- 你真的對 Linux 中的 Inode 瞭解嗎?Linux
- null 不好,我真的推薦你使用 OptionalNull
- 你真的會用PostGIS中的buffer緩衝嗎?
- stl中的sort函式,你真的瞭解嗎函式
- 你真的理解$nextTick麼
- WebView你真的熟悉嗎?WebView
- 你真的知道Python中的賦值與拷貝嗎?Python賦值
- 在Java中,你真的會日期轉換嗎Java
- 靈魂拷問:你真的理解System.out.println()列印原理嗎?
- Android:寫了這麼多程式碼,你真的理解泛型嗎Android泛型
- 每天加班的你,真的會工作嗎?
- 你真的知道js的原型鏈嗎??JS原型
- 【極客思考】設計模式:你確定你真的理解了單例模式嗎?設計模式單例
- 你真的懂C++嗎?C++
- 你真的瞭解@Async嗎?
- TCP|你真的懂 HTTP 嗎?TCPHTTP
- 你真的瞭解HTAP嗎
- 你真的懂Python命名嗎?Python
- ViewStub你真的瞭解嗎View