T-SQL NULLIF returns NULL 为零

T-SQL NULLIF returns NULL for zero

为什么下面的脚本 returns NULL 而不是 0?

DECLARE @number BIGINT = 0;

SELECT  NULLIF(@number, '');

根据MSDN,应该return 0:

NULLIF
Returns a null value if the two specified expressions are equal.

对于SQL服务器,0''被认为是相同的(=equal)?背后的逻辑是什么?

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

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

0
0
1900-01-01

https://docs.microsoft.com/en-us/sql/t-sql/data-types/data-type-precedence-transact-sql

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

基本上SQL服务器首先尝试匹配两个表达式的数据类型,然后检查值。

DECLARE @number BIGINT = 0;

SELECT 
    CONVERT(BIGINT, '')
    , NULLIF(@number, '')
    , NULLIF(@number, CONVERT(BIGINT, ''))

BOL 所述:"the rules for data type precedence specify that the data type with the lower precedence is converted to the data type with the higher precedence." 您有两种不同的数据类型,bigintnvarchar。为了比较两者,它们必须是相同的数据类型。按照描述的规则,nvarchar 隐式转换为 bigint。试试 select convert(bigint, ''),你会发现结果是 0。所以他们是一样的。

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

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

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