1 回答

TA貢獻1810條經驗 獲得超4個贊
CONCAT并且+不要操作相同。如果任何表達式NULL在使用時具有值+,NULL則將返回。對于CONCAT,它將隱式替換NULL為'',因此NULL不會返回。
CONCAT還會將表達式中的任何值隱式轉換為(n)varchar,其中 as+使用數據類型優(yōu)先級來確定數據類型,并將表達式中的其他值隱式轉換為最高優(yōu)先級的數據類型。
例子:
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,狀態(tài) 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 關注
- 128 瀏覽
添加回答
舉報