我很好奇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。這是我可以信賴的嗎?
我很好奇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。這是我可以信賴的嗎?
你不能比較NULL與任何其它值將導致'UNKNOWN'
。
NULL的值表示的值是未知的。 NULL 的值與空值或零值不同。沒有兩個空值是 相等。兩個空值之間或NULL與任何其他值之間的比較返回未知,因爲每個NULL的值都是未知的。
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
它取決於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。
以下=
中的WHERE子句也是FALSE。你需要非常小心的NULLs
WITH ctx AS
(
SELECT 123 AS n0, NULL AS n1
)
SELECT *
FROM ctx
WHERE ctx.n1 = NULL