聊一聊Mysql中的字符串拼接函数

生死看淡,上来就干!

简单来说,Mysql中的字符串拼接函数主要有三个,分别是CONCAT()、CONCAT_WS()以及GROUP_CONCAT();废话不多说,下面就每个函数具体来看一下:

1、CONCAT()函数

该函数的标准格式应为CONCAT(str1,str2,…),可以有多个参数,Mysql官方手册上对该函数的描述是 Return concatenated string,
即返回串联的字符串。其实说白了就是对所有参数不加任何修饰的连接到一块,
如下sql所示:

mysql> 	SELECT CONCAT("My","sql","plus");
+---------------------------+
| CONCAT("My","sql","plus") |
+---------------------------+
| Mysqlplus                 |
+---------------------------+
1 row in set (0.01 sec)

可以再增加一个参数看下效果:

mysql> 	SELECT CONCAT("My","sql","plus","Apple");
+-----------------------------------+
| CONCAT("My","sql","plus","Apple") |
+-----------------------------------+
| MysqlplusApple                    |
+-----------------------------------+
1 row in set (0.00 sec)
参数理论上可以无限增加,但是我想肯定不会有人这么干,按需求来就好。
CONCAT(str1,str2,...)函数中如果有一个参数为NULL,那么返回的结果就是NULL,如下语句所示:
mysql> 	SELECT CONCAT("My","sql",NULL,"Apple");
+---------------------------------+
| CONCAT("My","sql",NULL,"Apple") |
+---------------------------------+
| NULL                            |
+---------------------------------+
1 row in set (0.00 sec)

在实际工作中按需使用即可。

2、CONCAT_WS()函数

该函数的标准格式应为CONCAT_WS(separator,str1,str2,…),
Mysql官方手册上对该函数的描述是Return concatenate with separator,
即返回用分隔符连接后的字符串,
它其实是函数 CONCAT(str1,str2,…)的一种特殊形式,CONCAT_WS()函数的第一个参数是其余参数的分隔符,分隔符被添加到要连接的字符串之间。分隔符可以是字符串,其他参数也可以是字符串。如果分隔符为NULL,则结果为NULL。如下所示:

mysql> 	SELECT CONCAT_WS("::","sql","plus","Apple");
+--------------------------------------+
| CONCAT_WS("::","sql","plus","Apple") |
+--------------------------------------+
| sql::plus::Apple                     |
+--------------------------------------+
1 row in set (0.00 sec)

mysql> 	SELECT CONCAT_WS(NULL,"sql","plus","Apple");
+--------------------------------------+
| CONCAT_WS(NULL,"sql","plus","Apple") |
+--------------------------------------+
| NULL                                 |
+--------------------------------------+
1 row in set (0.00 sec)

CONCAT_WS()不跳过空字符串。但是,它会跳过分隔符参数之后的任何空值。如下所示:

mysql> 	SELECT CONCAT_WS("-","My",NULL,"Sql"," ","Plus");
+-------------------------------------------+
| CONCAT_WS("-","My",NULL,"Sql"," ","Plus") |
+-------------------------------------------+
| My-Sql- -Plus                             |
+-------------------------------------------+
1 row in set (0.00 sec)

上面示例中CONCAT_WS()函数忽略了NULL值,但是" "没有忽略,这是在使用中需要注意的地方。

3、GROUP_CONCAT()函数

该函数主要用于分组查询中,返回一个字符串数据,其中包含组中连接的非空值。如果没有非空值,则返回空值。 单看这些描述,感觉是有点摸不着头脑,不过不用着急,结合示例就会恍然大悟了。
查看示例之前首先看下语法结构:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

没错,GROUP_CONCAT()函数的参数可以是sql中相应的表达式,可以包含DISTINCT关键字ORDER BY排序等等。看下具体示例:
新建表结构如图所示
聊一聊Mysql中的字符串拼接函数_第1张图片
具体需求是在部门表中找到所有部门人数相同的部门的ID并拼接成字符串:

mysql> SELECT nums,count( 1 ) total,
	GROUP_CONCAT(dname),## 默认使用的是逗号分隔
	GROUP_CONCAT( DISTINCT deptno ORDER BY deptno DESC SEPARATOR "-" ) AS deptNo #以"-"分隔,并按照deptno降序排列
FROM dept 
	GROUP BY nums 
	HAVING total > 1;
+------+-------+-----------------------+--------+
| nums | total | GROUP_CONCAT(dname)   | deptNo |
+------+-------+-----------------------+--------+
| NULL |     2 | IT运维,公关部           | 10-9   |
|   10 |     2 | 财务部,市场部           | 4-3    |
|   15 |     2 | 运维部,大数据           | 8-5    |
|   20 |     2 | 研发部,人事部           | 2-1    |
|   30 |     2 | 技术部,bigdata2018     | 7-6    |
+------+-------+-----------------------+--------+
5 rows in set (0.00 sec)

还记的上面描述中所说的“如果没有非空值,则返回空值。”吗?deptno为9和10的数据 nums字段为NULL,也就是为空值,换句话说就是没有非空的值,则最终返回的结果为NULL值。在对比一下deptno为1~8的数据,应该就能明白了。

你可能感兴趣的:(数据库,mysql,数据库)