为什么输出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)
返回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 的整数。此外,这导致两者之间的比较评估为真。
正如第一个值所暗示的那样,该函数是否有可能将nullif
两个值都转换为 typebit
或?int
如果是这样,它们都将评估为 0 值,因此nullif
将返回null
如您所见。
这可以解释为什么转换为varchar
可以解决问题。