T-SQL NULLIF为零返回NULL

时间:2017-12-12 09:40:59

标签: sql sql-server tsql sql-server-2017 nullif

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

DECLARE @number BIGINT = 0;

SELECT  NULLIF(@number, '');

根据MSDN,它应该返回0

  

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

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

5 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

BOL所述:“数据类型优先级的规则指定具有较低优先级的数据类型转换为具有较高优先级的数据类型。” 您有两种不同的数据类型bigintnvarchar。为了比较两者,它们必须是相同的数据类型。遵循所述规则,nvarchar会隐式转换为bigint。试试select convert(bigint, ''),您会在0中找到结果。所以他们是一样的。

答案 2 :(得分:1)

这个脚本应该返回null,这是真的! 它背后的原因是''是一个字符串,所以当它与你现在正在做的整数比较时,它将被隐式地转换为整数值! 一般来说,当您比较不同数据类型的值时,您会遇到麻烦,因为隐式转换发生在场景后面。

答案 3 :(得分:0)

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

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

DECLARE @number BIGINT = 0;

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

答案 4 :(得分:0)

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

的方式
SELECT CONVERT(INT, '')  -- 0
SELECT CAST('' AS INT)   -- 0