T-SQL NULLIF为零返回NULL

T-SQL NULLIF为零返回NULL,sql,sql-server,tsql,sql-server-2017,nullif,Sql,Sql Server,Tsql,Sql Server 2017,Nullif,为什么下面的脚本返回NULL而不是0 DECLARE @number BIGINT = 0; SELECT NULLIF(@number, ''); 根据MSDN,它应该返回0: NULLIF 如果指定的两个表达式相等,则返回空值 对于SQL server,0和'被认为是相同的(=相等)?背后的逻辑是什么?当运算符组合两个不同数据类型的表达式时,数据类型优先级规则指定优先级较低的数据类型转换为优先级较高的数据类型 SELECT CONVERT(bigint, '') SELECT CONV

为什么下面的脚本返回
NULL
而不是
0

DECLARE @number BIGINT = 0;

SELECT  NULLIF(@number, '');
根据MSDN,它应该返回
0

NULLIF
如果指定的两个表达式相等,则返回空值


对于SQL server,
0
'
被认为是相同的(=相等)?背后的逻辑是什么?

当运算符组合两个不同数据类型的表达式时,数据类型优先级规则指定优先级较低的数据类型转换为优先级较高的数据类型

SELECT CONVERT(bigint, '')
SELECT CONVERT(float, '')
SELECT CONVERT(date, '')

0
0
1900-01-01

这是隐式转换的结果。在某些情况下,可以将字符串值转换为整数(例如将空字符串转换为0)

实际上,SQLServer首先尝试匹配两个表达式的数据类型,然后检查值

DECLARE @number BIGINT = 0;

SELECT 
    CONVERT(BIGINT, '')
    , NULLIF(@number, '')
    , NULLIF(@number, CONVERT(BIGINT, ''))
As声明:“数据类型优先级规则指定优先级较低的数据类型转换为优先级较高的数据类型。” 您有两种不同的数据类型,
bigint
nvarchar
。为了比较两者,它们必须是相同的数据类型。按照所描述的规则,
nvarchar
被隐式转换为
bigint
。尝试
选择convert(bigint,”)
,您会发现它的结果是
0
。因此它们是相同的。

它已将
'
转换为整数,即
0
,因为整数在数据类型中具有更高的优先级。检查下面的示例,看看
'
如何变成
0

SELECT CONVERT(INT, '')  -- 0
SELECT CAST('' AS INT)   -- 0

这个脚本应该返回null,这是真的! 它背后的原因是“”是一个字符串,因此在将其与整数进行比较时,它将隐式转换为整数值,就像您现在所做的那样! 通常,在比较不同数据类型的值时,您会自找麻烦,因为隐式转换发生在幕后。

meta dupe:可能的重复