當ANSI_NULLS 為ON時,遵循SQL92的標准,只能使用IS NULL 來判斷值是否為NULL, 而不能使用=或<>來與NULL做比較,任何值包括NULL值與NULL值做=或<>運算都得到FALSE
當ANSI_NULLS為OFF時,將不再遵循SQL92標准,可以使用=和<>來與NULL做BOOL運算
測試代碼
SET ANSI_NULLS ON
;WITH T1 AS
(
SELECT 1 AS ID
UNION ALL
SELECT NULL
UNION ALL
SELECT 2
)
SELECT * FROM T1
WHERE ID =NULL
GO
SET ANSI_NULLS OFF
;WITH T1 AS
(
SELECT 1 AS ID
UNION ALL
SELECT NULL
UNION ALL
SELECT 2
)
SELECT * FROM T1
WHERE ID =NULL
測試結果:
第二次查詢能獲取NULL的一行
關於NULL的延伸:
1. 對應聚合函數COUNT,只有SELECT COUNT(*)和SELECT COUNT(1) 會將為NULL的行計算在內,SELECT COUNT(ID)會忽略ID列為NULL的行
2. 對應除COUNT外的其他聚合函數,計算時不考慮為NULL的行
3. 對應CHECK CONSTRAINT,如果列允許為NULL的條件下,為NULL的行將不受CHEKC CONSTRAINT的限制,例如有CHECK CONSTRAINT條件為C1>10,對C1列插入NULL值或更新為NULL不會違反CHECK CONSTRAINT.
4. 在GROUP BY 的時候,會將所有NULL歸為一組