MySQL查询结果集字符串操作之多行合并与单行分割

前言

我们在做项目写sql语句的时候,是否会遇到这样的场景,就是需要把查询出来的多列,按照字符串分割合并成一列显示,或者把存在数据库里面用逗号分隔的一列,查询分成多列呢,常见场景有,文章标签,需要吧查询多个标签合并成一列,等,需要怎么去实现呢,这就涉及到MySQL的字符串操作

group_concat

场景再现 我想把查询多列数据合并成一列显示用逗号分隔就需要用到group_concat这个函数

下面sql语句

1select r.ROLE_NAME 2from t_user u 3 right join t_user_role ur on ur.USER_ID = u.USER_ID, 4 t_role r 5where r.ROLE_ID = ur.ROLE_ID 6 and u.USER_ID = 7

ID为7的用户有两个角色,但是我现在想把它显示成一列,就需要用到字符串函数group_concat 如下sql

1select group_concat(r.ROLE_NAME) 2from t_user u 3 right join t_user_role ur on ur.USER_ID = u.USER_ID, 4 t_role r 5where r.ROLE_ID = ur.ROLE_ID 6 and u.USER_ID = 7;

实现了我需要的功能

当然group_concat函数默认使用逗号,进行连接,我们也可以自己指定分隔连击符如group_concat(name separator ';')

1select group_concat(r.ROLE_NAME separator ';') 2from t_user u 3 right join t_user_role ur on ur.USER_ID = u.USER_ID, 4 t_role r 5where r.ROLE_ID = ur.ROLE_ID 6 and u.USER_ID = 7;

当然实际应用不单单这么简单,需要结合子查询使用,

如下sql 查询用户详细信息,就包括用户角色信息部门信息

1select tu.*, 2 d.DEPT_NAME, 3 (select group_concat(r.ROLE_NAME) 4 from t_user u 5 left join t_user_role ur on ur.USER_ID = u.USER_ID, 6 t_role r 7 where r.ROLE_ID = ur.ROLE_ID 8 and u.USER_ID = tu.USER_ID) as roles 9from t_user tu 10 left join 11 t_dept d 12 on tu.DEPT_ID = d.DEPT_ID 13where tu.USER_ID=7;

substring_index(str,delim,count)

场景在现某些业务表出于历史原因或性能原因,都使用了违反第一范式的设计模式。即同一个列中存储了多个属性值。如下表中的 theme 所示:

这种情况下,可以考虑将该列根据分隔符进行分割,形成多个列就需要使用到substring_index函数

1SUBSTRING_INDEX(str,delim,count) 2-- str: 被分割的字符串; delim: 分隔符; count: 分割符出现的次数

对于字符串 “1,2,3” ,设置delim为 “,”,count为1,就会返回 “1”;其它参数不变,count为2,就会返回 “1,2”;其它参数不变,count为-1,就会返回 “3”。

如下sql

1select USERNAME, 2 (select substring_index(tu.THEME, ',', 1) from t_user tu where tu.USER_ID = 1) theme1, 3 (select substring_index(tu.THEME, ',', 2) from t_user tu where tu.USER_ID = 1) theme2, 4 (select substring_index(tu.THEME, ',', -1) from t_user tu where tu.USER_ID = 1) theme3 5from t_user 6where USER_ID = 1;

显然不符合我们所需要的,我们可以在嵌套sql自查询实现如下

1select USERNAME, 2 (select substring_index(tu.THEME, ',', 1) from t_user tu where tu.USER_ID = 1) theme1, 3 (select substring_index((select substring_index(tu.THEME, ',', 2) from t_user tu where tu.USER_ID = 1),',',-1) theme2), 4 (select substring_index(tu.THEME, ',', -1) from t_user tu where tu.USER_ID = 1) theme3 5from t_user 6where USER_ID = 1;

当然这个计算应该是动态的可以参考参考实现

点赞
收藏

评论区

加载中...

相关推荐

Spark DataFrame列的合并与拆分

版本说明:Spark2.3.0使用SparkSQL在对数据进行处理的过程中,可能会遇到对一列数据拆分为多列,或者把多列数据合并为一列。这里记录一下目前想到的对DataFrame列数据进行合并和拆分的几种方法。1DataFrame列数据的合并例如:我们有如下数据,想要将三列数据合并为一列,并以“,”分割

MySql 小表驱动大表

在了解之前要先了解对应语法in与exist。IN:selectfromAwhereA.idin(selectB.idfromB)in后的括号的表达式结果要求之输出一列字段。与之前的搜索字段匹配,匹配到相同则返回对应行。mysql的执行顺序是先执行子查询,然后执行主查询,用子查询的结果按条匹配

MySQL数据查询(重点)

1.查询所有列  \为所有列select\fromtable\_name;2.查询指定列selectid,agefromtable\_name;3.查询时添加常量列本次查询有效,不会添加到表中,只显示 可以用as来命名本列名select'java0328'fromtable\_name;

mysql 学习笔记

1在使用多列作为主键时,上述条件必须应用到所有列,所有列值的组合必须是唯一的(但单个列的值可以不唯一)。2多条SQL语句必须以分号(;)分隔。3在选择多个列时,一定要在列名之间加上逗号4DISTINCT关键字作用于所有的列,不仅仅是跟在其后的那一列5返回特定数量的行:各种数据库中的这一SQ

Codeforces997C Sky Full of Stars 【FMT】【组合数】

题目大意:一个$n\n$的格子,每个格子由你填色,有三种允许填色的方法,问有一行或者一列相同的方案数。题目分析:标题的FMT是我吓人用的。一行或一列的问题不好解决,转成它的反面,没有一行和一列相同的方案数。从一个方向入手,比如列,把一列看成一个整体。把颜色看成二进制数,$001$,$010$,$100$。那么一列构成了一个长度为$3

oracle 聚合函数 LISTAGG ,将多行结果合并成一行

LISTAGG(列名,' 分割符号')oracle11g以上的版本才有的一个将指定列名的多行查询结果,用指定的分割符号 合并成一行显示:例如:表原始数据:!(https://oscimg.oschina.net/oscnet/8ea6493fe801ffe266338444d7e380ac15c.png)需求:将mb1\_Tr