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

时间:2016-01-06 11:49:30

标签: sql-server tsql type-conversion 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。为什么?

2 个答案:

答案 0 :(得分:2)

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

Data Type Precedence ...

  

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

由于int的{​​{1}}超过Precedencechar将转换为''

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

ISNULL ...

  

返回与check_expression相同的类型。如果是文字NULL   以check_expression的形式提供,返回的数据类型   replacement_value。如果提供了文字NULL作为check_expression   并且没有提供replacement_value,返回一个int

但在第二种情况下true@charTypenull会将值ISNULL转换为0,然后查询

所以

nvarchar

因此它打印PRINT CASE WHEN '0' = '' THEN 'true' ELSE 'false' END

答案 1 :(得分:0)

试试这个:

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

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

你想要达到什么目标?