TSQL中的ISNULL和隐式数据类型转换



在使用ISNULL时,我遇到了一个有点奇怪的数据类型转换行为。看看这个:

PRINT CASE WHEN ISNULL('', 0) = 0 THEN 'true' ELSE 'false' END
PRINT CASE WHEN ISNULL('', 0) = '' THEN 'true' ELSE 'false' END
PRINT CASE WHEN ISNULL(NULL, 0) = '' THEN 'true' ELSE 'false' END

所有这些表达式的计算结果均为true。但是,当我声明一个nvarchar变量并将其设置为NULL时,会发生以下情况:

DECLARE @charType nvarchar; SET @charType = NULL;
PRINT CASE WHEN ISNULL(@charType, 0) = '' THEN 'true' ELSE 'false' END

这也应该计算为true,但它的计算结果为false。为什么?

此处ISNULL('', 0)返回''ISNULL(NULL, 0)返回0

Data Type Precedence。。。

当运算符组合不同数据类型的两个表达式时数据类型优先级规则指定优先级越低,则转换为优先级越高的数据类型优先如果转换不是支持的隐式转换,则返回错误。

由于intchar具有更多的Precedence,因此''将被转换为int

select cast('' as int) ==> 0

因此,在第一种情况下,所有''都将转换为0,因此查询将减少为

PRINT CASE WHEN 0 = 0 THEN 'true' ELSE 'false' END
PRINT CASE WHEN '' = '' THEN 'true' ELSE 'false' END
PRINT CASE WHEN 0 = 0 THEN 'true' ELSE 'false' END

因此打印true

ISNULL。。。

返回与check_expression相同的类型。如果文字NULL为作为check_expression提供,返回replacement_value。如果提供文本NULL作为check_expression并且没有提供replacement_value,则返回一个int

但在第二种情况下,由于@charTypenullISNULL将把值0转换为nvarchar,则查询变为

所以

PRINT CASE WHEN '0' = '' THEN 'true' ELSE 'false' END

因此,它打印false

试试这个:

PRINT CASE WHEN CAST(ISNULL('', 0) AS nvarchar) = 0 THEN 'true' ELSE 'false' END
PRINT CASE WHEN CAST(ISNULL('', 0) AS nvarchar) = '' THEN 'true' ELSE 'false' END
PRINT CASE WHEN CAST(ISNULL(NULL, 0) AS nvarchar) = '' THEN 'true' ELSE 'false' END

正如您所看到的,SQL知道当@charType设置为nvarchar类型时,它需要强制转换为nvarchal。

你想达到什么目的?