MySQL和SQL Sever的SQL拼接有些不同。

MySQL拼接符号+CONCATCONCAT_WSGROUP_CONTACT

SQL Sever拼接符号+for xml path

MyTable
ID Name Score1 Score2
1 A 90 67
2 B 66 56
3 C 87 78
4 D 67 96
5 A 97 78
6 D 78 67
7 E 56 86

MySQL

+

当两个字段都是整型时,MySQL和SQL Sever结果相同,都会返回两个整型值的和;

当两个字段中有一个为字符串时,MySQL的返回结果——默认字符串为0,再返回两个字段之和,而SQL Sever的返回结果——直接拼接两个字段。

1
2
3
select Score1 + Score2 where ID = 1;//都返回两个字段之和,即157

select Name + Score1 where ID = 1 ;//MySQL返回90,SQLSever返回A90

CONCAT

CONTACT的功能是直接将数据按照字符串格式拼接

1
select CONCAT(ID,Name,Score1) from MyTable where ID = 1;//返回值为 1A90;

PS:如果CONCAT后括号里其中有一个参数的值为null,那么这个语句的返回值就为null

CONCAT_WS

用法与CONCAT类似,其中第一个参数为分隔符,在返回的值中,每一个参数之间都会有第一个参数作为分隔。

1
select CONCAT_WS('-',ID,Name,Score1) from MyTable where ID = 1;//返回值为 1-A-90;

PS:如果分隔符(即第一个参数)为null,那么返回值为null;如果后边的参数(除分隔符之外的参数)有null,那么这个参数会被忽略,只返回其他参数和分隔符组成的字符串。

GROUP_CONTACT

在我们使用数据库时,会碰到这样一种情况:同一个Name的人有两条数据,但是他们的其他数据并不相同,而我们所需要的是同一个Name的人的Score1集合,即需要获得Name为A的所有的Score1并且希望将其拼接为一个字段,这里我们就需要用到ROUP_CONCAT。

语法如下:

group_concat(要连接的字段) [Order BY 排序字段 ASC/DESC] [Separator '分隔符']

1
2
select Name,GROUP_CONCAT(Score1 Separator '-') FROM MyTable GROUP BY Name;
//其中GROUP BY 后面的字段是Name,所有同一排序字段的数据会被拼接后存入同一字段中,并以相应的分隔符分分隔。

结果如下:

Name GROUP_CONCAT(Score1 SEPARATOR’-‘)
A 90-97
B 66
C 87
D 67-78
E 56

其中GROUP BY 后面的字段是Name,所有同一排序字段的数据会被拼接后存入同一字段中,并以相应的分隔符分分隔。

PS:GROUP_CONCAT默认长度为1024。可以用下列语句查看并修改其长度。

1
2
3
SHOW VARIABLES LIKE "%group_concat_max_len%"//查看长度

SET SESSION group_concat_max_len = 102400; //修改长度

SQL sever

将一整列的值拼接为一个字符串 for xml path

在Sql Server中可以将数据以xml格式显示,for xml path就是显示为xml的一种方式。

1
2
3
select ',' + Name from MyTable for xml path('');
//预期结果如下:
,A,B,C,D,A,D,E

第一个A前面多了一个逗号,这是在查询语句中就标明了的,如果想要去除这个逗号,就需要用到stuff函数。

PS:语句末尾的('')不可少,他的功能是为了去除表格中的行标志,因为在数据库表中,这些数据来自同一列的不通行,需要使用这种方法去除行标志,不然数据在xml中仍然会以列的形式呈现。

STUFF(string,insert position,delete count,string inserted)

它函数的功能是将一个字符串插入到另一个字符串中。插入时,插入的字符串可以覆盖原有的指定数量的字符。

 第一个参数string,指的就是原字符串,即需要被改变的字符串,它可以是一个固定字符串,也可以指定为数据库中的某一字段列,在这里我们填写的是经过for xml path处理过的字段;

 第二个参数insert position,指插入字符串的位置,SQL Server中默认是从1开始,而非从0开始,在这里我们需要删除字符串首的逗号,因此我们的insert position为1;

 第三个参数delete count,指的是要删除的字符个数,从insert position删除指定的个数,如果count为0表示不删除,我们只需要删除一个逗号,因此delete count也为1;

 第四个参数string inserted,表示要插入的字符串,在删除过后,可以在删除的位置插入想要的字符串,如果不插入字符串,则第四个参数即为两个单引号;

综上所述,我们的语句应为:

1
2
3
select stuff((select ',' + Name from MyTable for xml path('')),1,1,'');	
//返回结果如下
A,B,C,D,A,D,E