9

为什么输出select nullif(0,'')是NULL?(预期为 0)。

为什么0等于''?

当我使用 select nullif(convert(varchar,0),'') 它实际上返回预期的 0。

NULLIF官方页面说该函数比较两个标量表达式。0 不是标量吗?请告诉我我的理解中缺少什么?

4

2 回答 2

11

整数的数据类型优先级更高,因此 varchar 被转换为 int。转换为 int 的空字符串是0,从那里很明显 ( 0 == 0)。

0 == 0,因此NULLIF(0, 0) => NULL(因为NULLIF(a, b)返回NULLiff 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 的整数。此外,这导致两者之间的比较评估为真。

于 2013-11-01T23:51:44.170 回答
1

正如第一个值所暗示的那样,该函数是否有可能将nullif两个值都转换为 typebit或?int

如果是这样,它们都将评估为 0 值,因此nullif将返回null如您所见。

这可以解释为什么转换为varchar可以解决问题。

于 2013-11-01T23:47:28.543 回答