使用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。为什么?
答案 0 :(得分:2)
此处ISNULL('', 0)
返回''
,ISNULL(NULL, 0)
返回0
当一个运算符组合了两个不同数据类型的表达式时, 数据类型优先级的规则指定具有的数据类型 较低的优先级转换为具有较高的数据类型 优先。如果转换不是受支持的隐式转换, 返回错误。
由于int
的{{1}}超过Precedence
,char
将转换为''
。
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
为@charType
,null
会将值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。
你想要达到什么目标?