为什么SQL Server中的以下表达式返回-9223372036854775808
而不是123
?
我从存储过程中调用它,我无法传递空参数
declare @t bigint;
set @t = -9223372036854775808; --min value for bigint / long
select ISNULL(@t, 123)
答案 0 :(得分:11)
由于:
IF @t IS NOT NULL
PRINT @t
ELSE
PRINT 123
否定并不意味着该值为NULL。 NULL是完全没有任何值。
答案 1 :(得分:4)
因为@t不为空。
是什么让你认为bigint的最负值会被解释为null?
答案 2 :(得分:3)
如果@t为NULL,则ISNULL(@t, 123)
函数返回123,否则返回@t。你可能想做这样的事情。
NULLIF(@t, -9223372036854775808)
如果@t等于-9223372036854775808,则返回NULL。如果两个表达式不相等,则NULLIF返回第一个表达式(@t)。
答案 3 :(得分:2)
要实现我想要实现的目标,请尝试以下方法:
declare @t bigint;
set @t = -9223372036854775808; --min value for bigint / long
select ISNULL(NULLIF(@t, -9223372036854775808) , 123)
或者这个:
declare @t bigint;
set @t = -9223372036854775808; --min value for bigint / long
select case @t when -9223372036854775808 then 123 else @t end
答案 4 :(得分:1)
@t不为null,因为您为其分配了值。如果您希望ISNULL()返回123,请删除分配。
declare @t bigint;
select ISNULL(@t, 123)
答案 5 :(得分:1)
您似乎假设-9223372036854775808 IS NULL
不正确。 ISNULL(@t, 123)
只会在@t IS NULL
时返回NULL,但它不为空,因为它的值为-9223372036854775808
非NULL。
答案 6 :(得分:1)
ISNULL返回第一个非空值,它们都是非空的(有值),所以它返回第一个。