SQL拼接
MySQL和SQL Sever的SQL拼接有些不同。
MySQL拼接符号+
、CONCAT
、CONCAT_WS
、GROUP_CONTACT
SQL Sever拼接符号+
、for xml path
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 | select Score1 + Score2 where ID = 1;//都返回两个字段之和,即157 |
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 | select Name,GROUP_CONCAT(Score1 Separator '-') FROM MyTable 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 | SHOW VARIABLES LIKE "%group_concat_max_len%"//查看长度 |
SQL sever
将一整列的值拼接为一个字符串 for xml path
在Sql Server中可以将数据以xml格式显示,for xml path就是显示为xml的一种方式。
1 | select ',' + Name from MyTable for xml path(''); |
第一个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 | select stuff((select ',' + Name from MyTable for xml path('')),1,1,''); |