2013-11-01 68 views

回答

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。此外,这会导致两个结果为true之间的比较。

+0

非常好的解释啦啦队朋友:) –

+0

谢谢科尔宾的解释!这可能是一个偏离的问题,但为什么你不能比较两种不同的数据类型,因为所有的数据都由符号组成,如果符号序列相同,那么两个项目是相同的,如果不是 - 那么它们是不同。或者它是否太人性化的思维方式? – user2616821

+0

在哪个sql版本中'SELECT''= 0'返回true? –

1

nullif函数是否有可能将这两个值都输入为bitint,如第一个值所暗示的那样?

如果是这样,他们都将评估值为0,因此nullif将返回正如你所看到的。

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

+0

它将它们转换为int。 – Hogan

+0

选择CAST(''as int) – bummi

+0

啊,谢谢,我认为这是一个演员阵容,但我不知道空字符串会导致整数0. –