为什么select nullif(0,'')
的输出为NULL? (预计为0)。
为什么0等于''?
当我使用select nullif(convert(varchar,0),'')时,它实际上返回了预期的0.
NULLIF
官方页面说该函数比较了两个标量表达式。 0不是标量?请告诉我在理解中我缺少什么?
答案 0 :(得分:11)
整数在data type precedence中更高,因此varchar转换为int。转换为int的空字符串是0
,从那里很明显(0 == 0
)。
0 == 0
,因此NULLIF(0, 0) => NULL
(自NULLIF(a, b)
返回NULL
iff a == b
)
执行nullif(convert(varchar,0),'')
时,您只是NULLIF('0', '')
。显然,只包含0和空字符串的字符串不相等,因此您得到0
。
更深入的解释是,实际上无法比较两种不同的类型。您不能将字符串与整数,字符串和浮点数,或整数和浮点数等进行比较。这意味着要进行不同类型的比较,必须有某种隐式强制转换规则。在这种情况下,如果你比较一个字符串(好吧,技术上是一个varchar)和一个int,varchar会被隐式转换为一个int。如果您考虑以下因素,这将更容易看到:
SELECT CONVERT(INT, '');
IF '' = 0 SELECT 'Equal' ELSE SELECT 'Not equal';
正如您将看到的,转换产生一个0的整数。此外,这导致两者之间的比较为真。
答案 1 :(得分:1)
nullif
函数是否有可能将这两个值都输入bit
或int
,如第一个值所暗示的那样?
如果是这样,他们都会评估值为0,因此nullif
会返回null
,如您所见。
这可以解释为什么转换为varchar
可以解决问题。