判斷變數是否為NULL:
IF (@VaribleName IS NULL)
選擇欄位值為NULL的記錄:
WHERE COLUMN_NAME IS NULL
ISNULL()函數:
ISNULL(@VaribleName, 'DefaultValue')
ISNULL(COLUMN_NAME, 'Default Value')
SQL Server:關於Null的一些事
我們設計表時,在欄位是否允許Null值這個問題上,有時會爭論一番。資料庫牛人Kalen Delaney則給了一下建議
1,永遠不要在使用者表中允許NULL值
2,在使用者表定義中包含一個NOT NULL限制
3,不要依賴資料庫屬性來控制NULL值的行為
對於第一點,我們反向說,如果允許NULL,會給我們帶來什麼影響。
1,SQL 在每條記錄中都設定了一個特殊的bitmap來顯示哪些允許空值的列上儲存的真的是空值。如果是NULL,在訪問每一行的時候SQL Server都必須對這個bitmap進行解碼。
2,允許NULL還增加了應用程式代碼的複雜度,總的添加一些特殊的邏輯來處理這個NULL值,這常常會導致bug。
第二點,在包含不允許NULL的列上,要加入一些預設值,如果不允許NULL,但是還沒有加預設值,在沒有顯示列插入的話,就會造成INSERT的失敗,SQL Server預設在INSERT中,對沒有顯示的列做NULL插入。
最後一點,主要涉及到於NULL值的比較。在我們印象中,是用IS NULL,IS NOT NULL比較呢,還是用=,<>比較呢。這取決於資料庫選項ANSI NULLS,我們不可能更改資料庫選項(我們大部分不是DBA),但是我們可以使用會話設定SET ANSI_NULLS相當於資料庫選項ANSI NULLS。當這個選項為真是,所有與空值的比較都將得出FALSE,代碼必須使用IS NULL條件來判斷是否為空白,而當這個選項為假時,如果進行比較的兩個值都是空值將得出TRUE,SQL Server允許將 =NULL作為IS NULL的同義字,將<> NULL 作為IS NOT NULL的同義字。
如果忘記這個選項,建議用IS NULL判斷空,IS NOT NULL判斷非空。
一、判斷變數是否為null
if (@VaribleName is null)
二、選擇欄位值為null的記錄
select * from orders where price is null --price等於null
select * from orders where price is not null --price不等於null
三、使用ISNULL函數對Null值替換
函數判斷一對象是否為空白,如果為空白,則替換成指定的預設值。
1、文法
ISNULL ( check_expression , replacement_value )
2、參數說明
check_expression
將被檢查是否為 NULL的運算式。check_expression 可以是任何類型的。
replacement_value
為 NULL時將返回的運算式。replacement_value 必須與 check_expresssion 具有相同的類型。
3、傳回值
如果 check_expression 不為 NULL,那麼返回該運算式的值;否則返回 replacement_value。
4、常用情況
ISNULL(@VaribleName, 'DefaultValue')
ISNULL(COLUMN_NAME, 'Default Value')
四、sql server null值的使用需要注意的地方
1、null與任何運算子運算後都為null
普通的值一般都可能進行運算子操作,但例如:ID列為int,所以可以這樣:ID=ID+1等,但如果一列的值為null,null+1=null
例如
update testNull
set b=b+1
where b is null
查詢後發現b的值沒有變化,仍然為null.
2、任何值與null比較時都會返回false
普通的值可以進行"="操作,例如條件中一般都會這樣出現:sUserName='張三',如果sUserName的值為null,要想找出所有名字為null的記錄時,不能這樣用:sUserName=null,因為null不是一個具體的值,任何值與它比較時都會返回false。此時可借用is null 或者是is not null.
例如
select * from testNull where a=null --返回空結果集
select * from testNull where b is null --返回結果集 2 2 NULL
說明null是不能用"="來比較,可用is null來替換
3、當統計的記錄中的包含有null值時,它會忽略null值
例如在用統計函數count時會不同,例如count(ID):統計記錄數.當統計的記錄中的包含有null值時,它會忽略null值.
4、對於in 的影響不同
樣本查詢:查詢testNull表中b的值包含在null中的記錄.
select * from testNull where b in(null) --沒有任何記錄
in在查詢時會忽略null的記錄,查詢的時候可用is not null來查詢
5、排序時順序有不同
當使用ORDER BY時,首先呈現NULL值。如果你用DESC以降序排序,NULL值最後顯示。
6、永遠不會有什麼資料等於NULL
1不等於NULL,2也一樣。但NULL也不等於NULL。所以我們只能比較它“是”或“不是”。