我有一个select语句,它组合了一个人名的多个段.这不是什么新鲜事.
SELECT FirstName + ' ' + LastName AS FullName FROM MyTable
Run Code Online (Sandbox Code Playgroud)
然后我尝试将中间的首字母添加到此,我想出了以下内容
SELECT FirstName + ' ' + ISNULL(MiddingInitial + ' ', '') + LastName AS FullName FROM MyTable
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但在我测试期间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'
*/
Run Code Online (Sandbox Code Playgroud)
知道为什么会出现这种行为吗?它对你有同感吗?
它归结为您正在使用的数据类型以及ISNULL函数的行为.我们来看一个例子:
null + 'Any String'
Run Code Online (Sandbox Code Playgroud)
以上完全符合varchar(11)数据类型.的NULL(这是真的只是结果char(0),并且具有长度为1)和连接在一起的规则10个字符的字符串,使对于11个字符总数.替换字符串 - ISNULL函数的第二个参数- 将被强制适合a varchar(11),因此它被截断为11个字符.
其余项目的模式重复,空字符串的特殊情况.
如果您不希望发生这种情况,请使用COALESCE,而不是采用列表中第一项的数据类型,它使用数据类型优先级.A varchar(15)优先于a 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'
*/
Run Code Online (Sandbox Code Playgroud)