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

时间:2013-11-01 23:33:05

标签: sql-server tsql

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

为什么0等于''?

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

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

2 个答案:

答案 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函数是否有可能将这两个值都输入bitint,如第一个值所暗示的那样?

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

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