为什么下面的脚本返回NULL
而不是0
?
DECLARE @number BIGINT = 0;
SELECT NULLIF(@number, '');
根据 MSDN,它应该返回0
:
NULLIF
如果两个指定的表达式相等,则返回空值。
对于SQL server,0
和''
被认为是一样的(=equal)?背后的逻辑是什么?
为什么下面的脚本返回NULL
而不是0
?
DECLARE @number BIGINT = 0;
SELECT NULLIF(@number, '');
根据 MSDN,它应该返回0
:
NULLIF
如果两个指定的表达式相等,则返回空值。
对于SQL server,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
正如BOL所说:“数据类型优先级规则指定将具有较低优先级的数据类型转换为具有较高优先级的数据类型。” 您有两种不同的数据类型,bigint
并且nvarchar
. 为了比较两者,它们必须是相同的数据类型。按照所描述的规则,nvarchar
被隐式转换为bigint
. 试一试select convert(bigint, '')
,你会发现它的结果0
。所以他们是一样的。
这个脚本应该返回 null 并且是真的!它背后的原因是 '' 是一个字符串,所以当你现在将它与一个整数进行比较时,它会被隐式转换为一个整数值!通常,当您比较不同数据类型的值时,您是在自找麻烦,因为隐式转换发生在幕后。
这是隐式转换的结果。在某些情况下,可以将字符串值转换为整数(例如将空字符串转换为 0)。
本质上,SQL Server 首先尝试匹配两个表达式的数据类型,然后检查值。
DECLARE @number BIGINT = 0;
SELECT
CONVERT(BIGINT, '')
, NULLIF(@number, '')
, NULLIF(@number, CONVERT(BIGINT, ''))
它已转换''
为整数,即0
,因为整数在数据类型中具有更高的优先级。检查下面的示例如何''
成为0
SELECT CONVERT(INT, '') -- 0
SELECT CAST('' AS INT) -- 0