+和CONCAT之间的区别?

时间:2017-08-04 19:58:44

标签: sql sql-server

以下是一个示例表:

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');

我有两个不同的数据库,其中一个是2012年,另一个是2008年。因此,我必须始终处理制作适用于两者的代码。我有一个工作的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。)

2 个答案:

答案 0 :(得分:4)

您需要初始化Declare @sql NVARCHAR(MAX)=''

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

更改它的第一行


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 :(得分:2)

  

+CONCAT之间的区别?

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

[1]联合NULL时,CONCAT会将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`