为什么输出select nullif(0,'')是NULL?(预期为 0)。
为什么0等于''?
当我使用 select nullif(convert(varchar,0),'') 它实际上返回预期的 0。
NULLIF官方页面说该函数比较两个标量表达式。0 不是标量吗?请告诉我我的理解中缺少什么?
为什么输出select nullif(0,'')是NULL?(预期为 0)。
为什么0等于''?
当我使用 select nullif(convert(varchar,0),'') 它实际上返回预期的 0。
NULLIF官方页面说该函数比较两个标量表达式。0 不是标量吗?请告诉我我的理解中缺少什么?
整数的数据类型优先级更高,因此 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 的整数。此外,这导致两者之间的比较评估为真。
正如第一个值所暗示的那样,该函数是否有可能将nullif两个值都转换为 typebit或?int
如果是这样,它们都将评估为 0 值,因此nullif将返回null如您所见。
这可以解释为什么转换为varchar可以解决问题。