2012-07-26 40 views
3

我很好奇t-SQL中是否合法將NULL與值進行比較?將t-SQL中的值與NULL比較

舉例來說,如果我有:

WITH ctx AS(SELECT 123 AS n0, NULL AS n1) 
SELECT n0 FROM ctx 
WHERE ctx.n1 < 130 

在這種情況下,WHERE子句總是被評估爲FALSE。這是我可以信賴的嗎?

回答

4

你不能比較NULL與任何其它值將導致'UNKNOWN'

msdn source

NULL的值表示的值是未知的。 NULL 的值與空值或零值不同。沒有兩個空值是 相等。兩個空值之間或NULL與任何其他值之間的比較返回未知,因爲每個NULL的值都是未知的。

0

T-Sql中所有帶空值的布爾操作都返回'UNKNOWN',它在子句中被識別爲false。當你想設置一些默認值時,你可以使用ISNULL功能。 例如,在你的情況:

WITH ctx AS(SELECT 123 AS n0, NULL AS n1) 
SELECT n0 FROM ctx 
WHERE isnull(ctx.n1,0) < 130 
2

它取決於ANSI_NULLS的值。

http://msdn.microsoft.com/en-us/library/ms191270%28v=sql.90%29.aspx

當SET ANSI_NULLS爲ON時,比較在其中一個或多個所述 表達式是NULL不會產生TRUE或FALSE;它產生 UNKNOWN。

Transact-SQL支持允許比較 運算符時比較空值時返回TRUE或FALSE的擴展名。 該選項通過設置ANSI_NULLS OFF來激活。當ANSI_NULLS是 OFF時,如ColumnA = NULL的比較在列A 包含空值時返回TRUE,而在列A包含除NULL之外的某些值 時返回FALSE。

0

以下=中的WHERE子句也是FALSE。你需要非常小心的NULLs

WITH ctx AS 
(
SELECT 123 AS n0, NULL AS n1 
) 
SELECT * 
FROM ctx 
WHERE ctx.n1 = NULL