+和CONCAT的区别?

+和CONCAT的区别?

问题描述:

下面是一个例子表:+和CONCAT的区别?

CREATE TABLE Example 
(
    LastName varchar(255), 
    FirstName varchar(255), 
    HomeAddress varchar(255), 
    City varchar(255) 
); 

INSERT INTO Example VALUES ('Murphy', 'James','123 Easy St', 'New York'); 
INSERT INTO Example VALUES ('Black', 'John','345 Youfarted St', 'Boston'); 
INSERT INTO Example VALUES ('Black', 'Amy','123 Simple St', 'Chicago'); 
INSERT INTO Example VALUES ('Simpson', 'Bill','123 Whofarted St', 'New York'); 
INSERT INTO Example VALUES ('Jones', 'James','321 Foo St', 'Chicago'); 
INSERT INTO Example VALUES ('Black', 'John','275 Ipsum St', 'Boston'); 
INSERT INTO Example VALUES ('Murphy', 'Sean','983 Ifarted St', 'New York'); 

我有2个不同的数据块,其中之一是2012年,2008年等SO,我必须总是使这两个工作的代码处理。我有一个工作的2012年查询(使用CONCAT()),但在2008年,试图用'+'使用相同的查询不会打印任何内容。

这工作:

DECLARE @sql2 NVARCHAR(max) 

SELECT 
    @sql2 = CONCAT(@sql2, ', COUNT(CASE WHEN city = ''', City, ''' THEN 1 END) as ', QUOTENAME(City)) 
FROM 
    Example 
GROUP BY City 

SET @sql2 = CONCAT('SELECT LastName', @sql2, ' FROM example GROUP BY LastName') 

EXEC sp_executesql @sql2 

将会产生的(这就是我想要的):

LastName Boston Chicago New York 
Black   2  0  0 
Jones   0  2  0 
Murphy   0  0  2 
Simpson   0  0  1 

此,不工作:

DECLARE @sql NVARCHAR(max) 

SELECT 
    @sql = @sql + ', COUNT(CASE WHEN city = ''' + City + ''' THEN 1 END) as ' + QUOTENAME(City) 
FROM 
    Example 
GROUP BY City 

SET @sql = 'SELECT LastName' + @sql + ' FROM example GROUP BY LastName' 

EXEC sp_executesql @sql 

通过“不起作用',我的意思是它不打印任何结果。我回来的是Command(s) completed successfully.

什么给?

OH!并请在这个查询的范围内工作。我知道还有其他方法可以给这只猫上皮,但这是我选择的方式。 (我需要它是动态的,我需要它不使用PIVOT。)

+0

这是什么节目?如果你试图运行它返回结果呢? – xQbert

+0

@xQbert - 我不知道你的意思。 – lukehawk

+0

@WorkSmarter - 对不起,这是我抓住吸管。删除这些不会做任何事情。 – lukehawk

需要初始化声明@sql NVARCHAR(MAX)=“”

原因:默认情况下,如果没有初始化这将是空,concat会将null作为空字符串处理,其中与+手动连接我们需要处理空值。

改变你的第一线,将工作+CONCAT之间


DECLARE @sql NVARCHAR(max) = '' --Initialize with empty string 

SELECT 
    @sql = @sql + ', COUNT(CASE WHEN city = ''' + City + ''' THEN 1 END) as ' + QUOTENAME(City) 
FROM 
    Example 
GROUP BY City 

SET @sql = 'SELECT LastName' + @sql + ' FROM example GROUP BY LastName' 

EXEC sp_executesql @sql 
+1

谢谢!我还添加了一个where子句,使其对可能在实际表中的NULL值进行强化(感谢@xQbert)。 – lukehawk

区别?

从我的观点来看,+CONCAT函数之间的两个主要区别是:

[1]当串联NULLCONCAT将取代NULL与空字符串和最终结果将是NOT NULL

SELECT CONCAT('a', NULL, 'b') -- generates 'ab' 
同时使用 +会产生 NULL或什么别的拼接根据 CONCAT_NULL_YIELDS_NULL

设置:

SET CONCAT_NULL_YIELDS_NULL ON -- Recommended setting 
SELECT 'a' + NULL + 'b' --> NULL 

SET CONCAT_NULL_YIELDS_NULL OFF 
SELECT 'a' + NULL + 'b' --> `ab` 

[2]当连接具有数字的字符串(例如),因为data type precedence它使用+CONCAT会自动时极有可能得到一个错误/异常。转换为字符串([N]VARCHAR):

SELECT 'a' + 'b' + 123 -- End result: exception because `INT (123)` has a higher precedence than `VARCHAR(ab)` -> SQL Server will try to convert "everthing" to `INT` -> exception because 'ab' can't be converted to INTs 
----------- 
Msg 245, Level 16, State 1, Line 7 
Conversion failed when converting the varchar value 'ab' to data type int. 

SELECT CONCAT('a', 'b', 123) --> `ab123` 
如果你写出来sp_execute @ SQL变量之前@SQL