为什么select nullif(0,'')
的输出是NULL? (预计为0)。为什么select nullif(0,'')的输出是NULL(预计为0)?
0何等于''?
当我用select NULLIF(转换(VARCHAR,0), ''),它实际上返回预期的0。
NULLIF
官方网页称,功能比较两个标量表达式。 0不是标量?请告诉我我的理解中缺少了什么?
为什么select nullif(0,'')
的输出是NULL? (预计为0)。为什么select nullif(0,'')的输出是NULL(预计为0)?
0何等于''?
当我用select NULLIF(转换(VARCHAR,0), ''),它实际上返回预期的0。
NULLIF
官方网页称,功能比较两个标量表达式。 0不是标量?请告诉我我的理解中缺少了什么?
整数在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之间的比较。
非常好的解释啦啦队朋友:) –
谢谢科尔宾的解释!这可能是一个偏离的问题,但为什么你不能比较两种不同的数据类型,因为所有的数据都由符号组成,如果符号序列相同,那么两个项目是相同的,如果不是 - 那么它们是不同。或者它是否太人性化的思维方式? – user2616821
在哪个sql版本中'SELECT''= 0'返回true? –