MSSQL中ISNULL()的奇怪行为

尼克·阿尔布雷希特

我有一条选择语句,它将一个人的名字的多个部分组合在一起。这不是什么新鲜事。

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'
*/

为什么会出现这种现象的任何想法?它对您有用吗?

老的

它取决于您正在使用的数据类型和ISNULL功能的行为让我们看一个例子:

null + 'Any String'

上面的内容非常适合varchar(11)数据类型。NULL(这是真的只是结果char(0),并且具有长度为1)和连接在一起的规则10个字符的字符串,使对于11个字符总数。替换字符串(ISNULL函数的第二个参数)将被强制装入varchar(11),因此将被截断为11个字符。

其余项目重复该模式,其中空字符串作为特殊情况。

如果您不希望发生这种情况,请使用COALESCE,它使用数据类型优先级来代替列表中第一项的数据类型。Avarchar(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'
*/

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章