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

0为何等于''?

当我使用select nullif(convert(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。

关于sql-server - 为什么select nullif(0 ,'')的输出为NULL(期望为0)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19737117/

10-10 04:49