在MSSQL中使用ISNULL()的奇怪行为

时间:2014-12-05 22:44:54

标签: sql sql-server

我有一个select语句,它组合了一个人名的多个段。这不是什么新鲜事。

SELECT FirstName + ' ' + LastName AS FullName FROM MyTable

然后我尝试将中间的首字母添加到此,我想出了以下

SELECT FirstName + ' ' + ISNULL(MiddingInitial + ' ', '') + LastName AS FullName FROM MyTable

这似乎有效,但在我对ISNULL()的测试中,我遇到了一个奇怪的行为。我知道NULL + 'any string'已解析为NULL。然而,这简直太奇怪了......

这是我的代码,以及我得出的结果......

print '''' + isnull(null + 'Any String','Results in null') + ''''
print '''' + isnull(null + 'Any','Results in null') + ''''
print '''' + isnull(null + 'A','Results in null') + ''''
print '''' + isnull(null + '','Results in null') + ''''
/*
'Results in '
'Resu'
'Re'
'Re'
*/

知道为什么会出现这种情况?它对你有同感吗?

1 个答案:

答案 0 :(得分:8)

归结为您正在使用的数据类型以及ISNULL函数的行为。让我们看一个例子:

null + 'Any String'

以上完全符合varchar(11)数据类型。 NULL(实际上只是char(0)的结果,长度为1)和连接在一起的常规10个字符的字符串共计11个字符。替换字符串 - 您的ISNULL函数的第二个参数 - 将被强制插入varchar(11),因此它被截断为11个字符。

其余项目的模式重复,空字符串的特殊情况。

如果您不希望发生这种情况,请使用COALESCE,而不是采用列表中第一项的数据类型,它使用数据类型优先级。 varchar(15)优先于varchar(11),因此您将获得完整的替换字符串:

print '''' + coalesce(null + 'Any String','Results in null') + ''''
print '''' + coalesce(null + 'Any','Results in null') + ''''
print '''' + coalesce(null + 'A','Results in null') + ''''
print '''' + coalesce(null + '','Results in null') + ''''
/*
'Results in null'
'Results in null'
'Results in null'
'Results in null'
*/