1 回答
TA贡献1810条经验 获得超4个赞
CONCAT并且+不要操作相同。如果任何表达式NULL在使用时具有值+,NULL则将返回。对于CONCAT,它将隐式替换NULL为'',因此NULL不会返回。
CONCAT还会将表达式中的任何值隐式转换为(n)varchar,其中 as+使用数据类型优先级来确定数据类型,并将表达式中的其他值隐式转换为最高优先级的数据类型。
例子:
SELECT c1,
c2,
c3,
c4,
c1 + c2 + c3 + c4, --NULL
CONCAT(c1, c2, c3, c4) --'abcdefxyc'
FROM (VALUES('abc','def',NULL,'xyz'))V(c1, c2, c3, c4);
隐式转换:
SELECT c1 + c2 + c3 + c4
FROM (VALUES('abc','def',7,'xyz'))V(c1, c2, c3, c4);
消息 245,级别 16,状态 1,第 9
行将 varchar 值“abcdef”转换为数据类型 int 时转换失败。
SELECT CONCAT(c1, c2, c3, c4) --'abcdef7xyz'
FROM (VALUES('abc','def',7,'xyz'))V(c1, c2, c3, c4);
有趣但预期的行为:
SELECT c1 + c2 + c3 + c4 --NULL
FROM (VALUES('abc','def',NULL,7))V(c1, c2, c3, c4);
SELECT c1 + c2 + c3 + c4 --123456790
FROM (VALUES('123','456','789',1))V(c1, c2, c3, c4);
这种行为的原因是因为表达式是从左到右计算的。对于第一个,因此您有'abc' + 'def' = 'abcdef'( 'abcdef' + NULL = NULL) varchar。最后你有了NULL + 7 = NULL,这很好,NULL可以隐式转换为int.
对于后者,你有'123' + '456' = '123456'then '123456' + '789' = '123456789'。最后你有'123456789' + 1 = 123456789 + 1 = 123456790. 请注意,在最终表达式中,varchar首先隐式转换为 a int,然后+运算符充当加法,而不是串联。
- 1 回答
- 0 关注
- 114 浏览
添加回答
举报