我有一个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'
*/
知道为什么会出现这种情况?它对你有同感吗?
答案 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'
*/