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

use*_*821 8 t-sql sql-server

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

为什么0等于''?

当我使用选择NULLIF(转换(VARCHAR,0), ''),它实际上返回预期的0.

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

Cor*_*bin 11

整数在数据类型优先级中较高,因此varchar将转换为int.转换为int的空字符串是0,从那里它很明显(0 == 0).

0 == 0,因此NULLIF(0, 0) => NULL(因为NULLIF(a, b)返回NULLiff 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'; 
Run Code Online (Sandbox Code Playgroud)

正如您将看到的,转换产生一个0的整数.此外,这导致两者之间的比较为true.