首页 > 问答 > 关键词  > mysql最新资讯  > 正文

MySQL怎么按指定字符合并及拆分 详细实例分析

2020-07-01 10:00 · 稿源:数据库干货铺

按照指定字符进行合并或拆分是经常碰到的场景,MySQL在合并的写法上比较简单,但是按指定字符拆分相对比较麻烦一点(也就是要多写一些字符)。本文将举例演示如何进行按照指定字符合并及拆分。

程序员 代码 黑客

1、 合并

MySQL数据库中按照指定字符合并可以直接用group_concat来实现。

创建测试表

mysql>createtabletb_group(idintauto_incrementprimarykey,col1varchar(20));
QueryOK,0rowsaffected(0.01sec)

插入测试数据

mysql>insertintotb_group(col1)values('a'),('c'),('dddd'),('ewdw'),('vxgdh');;
QueryOK,5rowsaffected(0.01sec)
Records:5Duplicates:0Warnings:0

合并col1 字段的内容

默认是按照逗号进行合并的,例如:

mysql>selectgroup_concat(col1)fromtb_group;
+---------------------+|group_concat(col1)|+---------------------+|a,c,dddd,ewdw,vxgdh|+---------------------+1rowinset(0.01sec)

指定分隔符合并,例如指定使用 || 符号进行合并

mysql>selectgroup_concat(col1,'||')fromtb_group;
+-------------------------------+|group_concat(col1,'||')|+-------------------------------+|a||,c||,dddd||,ewdw||,vxgdh|||+-------------------------------+1rowinset(0.00sec)

注意

默认情况下,合并后的长度不能超过1024,否则结果会被截断

例如,我再写个脚本插入一些数据

#使用shell脚本来实现
vimtest_insert.sh#添加如下内容
#!/bin/bash
#gjcforiin{1..1025}do
mysql-uroot-p'123456'--socket=/data/mysql3306/tmp/mysql.sock-e"insertintotestdb.tb_group1(col1)values('a')"done#运行脚本插入数据shtest_insert.sh
mysql>selectcount(*)fromtb_group;+----------+|count(*)|+----------+|1030|+----------+1rowinset(0.00sec)

再进行合并

mysql>selectgroup_concat(col1)cols,length(group_concat(col1))col_lenfromtb_group\G***************************1.row***************************
cols:a,c,dddd,ewdw,vxgdh,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,
col_len:10241rowinset,2warnings(0.01sec)

可以看出,结果中总长度字节只有1024

对于这种情况,实际使用时肯定是不满足的,如何解决呢?其实此长度与MySQL数据库的group_concat_max_len参数有直接关系(默认为1024)

mysql>showglobalvariableslike'group_concat_max_len';+----------------------+-------+|Variable_name|Value|+----------------------+-------+|group_concat_max_len|1024|+----------------------+-------+1rowinset(0.08sec)

那我们调整一下参数看看

/*修改全局参数,这样所有的新连接都会生效*/mysql>setglobalgroup_concat_max_len=102400;
QueryOK,0rowsaffected(0.01sec)/*修改本会话参数,这样当前连接不用退出也可以生效*/mysql>setsessiongroup_concat_max_len=102400;
QueryOK,0rowsaffected(0.00sec)
mysql>showglobalvariableslike'group_concat_max_len';+----------------------+--------+|Variable_name|Value|+----------------------+--------+|group_concat_max_len|102400|+----------------------+--------+1rowinset(0.00sec)
mysql>showvariableslike'group_concat_max_len';+----------------------+--------+|Variable_name|Value|+----------------------+--------+|group_concat_max_len|102400|+----------------------+--------+1rowinset(0.01sec)

再合并一下看看

mysql>selectgroup_concat(col1)cols,length(group_concat(col1))col_lenfromtb_group\G***************************1.row***************************
cols:a,c,dddd,ewdw,vxgdh,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a,a
col_len:20691rowinset(0.01sec)

这样结果就对了。因此生产环境中 该参数建议调整为合适的大小。

(Tips:Oracle数据库中可以使用listagg或wm_concat等多种方式实现,也比较简单,可以自行测试)

2、 拆分

按指定字符拆分字符串,也是比较常见的场景。但是MySQL数据库中字符串的拆分没有其他数据库那么方便(其他数据库直接有拆分函数),且需要借助mysql库中的mysql.help_topic表来辅助实现。例子如下:

创建测试表及数据

mysql>createtabletb_split(idintprimarykeyauto_increment,col1varchar(20));
QueryOK,0rowsaffected(0.01sec)
mysql>insertintotb_split(col1)values('a,b,c,d'),('c,a,g,h');
QueryOK,2rowsaffected(0.01sec)
Records:2Duplicates:0Warnings:0

按照逗号拆分

mysql>SELECTa.id,substring_index(substring_index(a.col1,',',b.help_topic_id+1),',',-1)NAME

这样也就实现了拆分。

按指定字符拆分

如果是其他分隔符的,修改瑞阳的分隔符字段即可。

mysql>insertintotb_split(col1)values('a|v|f');
QueryOK,1rowaffected(0.00sec)
mysql>select*fromtb_split;+----+---------+|id|col1|+----+---------+|1|a,b,c,d||2|c,a,g,h||3|a|v|f|+----+---------+3rowsinset(0.01sec)
mysql>SELECTa.id,substring_index(substring_index(a.col1,'|',b.help_topic_id+1),'|',-1)col_splitFROMtb_splitaJOINmysql.help_topicbONb.help_topic_id<(length(a.col1)-length(REPLACE(a.col1,'|',''))+1)wherea.id=3;+----+-----------+|id|col_split|+----+-----------+|3|a||3|v||3|f|+----+-----------+3rowsinset(0.00sec)

这样就完成按照指定字符的合并及拆分了。

3、 结语

本文介绍了MySQL常用的合并及拆分方法,对于擅长写SQL的同学也可以使用其他方式实现,以便解决权限不足(例如拆分时需要使用mysql库的help_topic表的权限)等情况下的需求。

本文转载自微信公众号【数据库干货铺】。

举报

  • 相关推荐
  • 大家在看
  • 小米Watch S1 Pro手机音频流转功能支持哪些设备?

    支持以下设备。手机音频流转功能需手机启用妙享中心后方能使用,目前仅支持部分音箱和电视机型,支持的音箱机型包括:Xiaomi Sound、Xiaomi AI 音箱第二代、小米小爱音箱、小米小爱音箱 Pro、小米智能家庭屏 6、小米智能家庭屏 10、Redmi 小爱触屏音箱 8、Redmi 小爱触屏音箱 Pro 8、小米小爱触屏音箱 Pro 8;支持的电视机型包括:小米电视大师 65英寸 OLED/77英寸 OLED/82英寸、小米电视 6 至尊版 55/65/75 英寸、小米电视 6 OLED 55/65英寸 、小米电视 5 及小米电视 5Pro 55/65/75英寸、小米电视全面屏Pro 43/55/65英寸、小米透明OLED电视 55英寸、小米电视 ES 43/50/55/65/75英寸、小米电视 ES Pro 86英寸、小米电视 EA 32/40/43/50/55/58/60/65/70/75 英寸 (2022款)、小米电视 4A 32/40/43/49/50/55/58/60/65/70 英寸、小米电视 4S 43/50/55/65/75英寸、小米电视 4C 40/43/50/55/58英寸、小米电视 4X 55英寸、小米电视4 55英寸、Redmi 智能电视 MAX 86/98/100英寸、Redmi 智能电视 X50/X55/X65/X75 (2022款)、Redmi 智能电视 A32/42/A43英寸,使用前请确保将设备软件更新至最新版本,后续将支持更多设备。

  • Redmi K50至尊版支持频段有哪些?

    5G:n1 / n3 / n5 / n8 / n28a等Redmi K50 至尊版支持的频段:5G:n1 / n3 / n5 / n8 / n28a(上行:703MHz-733MHz,下行:758MHz-788MHz)/ n38 / n40 / n41 / n77 / n78注:实际网络和频段使用情况取决于当地运营商部署,n3、n5、n8 频段需运营商发布后通过软件升级支持;4G:FDD-LTE:B1 / B3 / B4 / B5 / B8 / B18 / B19 / B26TDD-LTE:B34 / B38 / B39 / B40 / B41 / B42注:LTE B41(2496-2690 194MHz) ;3G:WCDMA:B1/ B4/ B5/ B6/ B8/ B192G:GSM:B2 / B3 / B5 / B8;CDMA 1X:BC0

  • 小米Watch S1 Pro触屏控制功能支持哪些设备?

    支持以下设备。触屏控制功能需手机启用妙享中心后方能使用,目前仅支持部分音箱和电视机型的控制,支持的音箱机型包括:小米智能家庭屏 6、小米智能家庭屏 10、小米小爱触屏音箱 Pro 8、Redmi 小爱触屏音箱 Pro 8、Redmi 小爱触屏音箱 8;支持的电视设备包括:小米电视大师 82 英寸/ 65 英寸 OLED、小米电视6 OLED 55/ 65 英寸、小米电视 5 及小米电视 5Pro 55/65/ 75 英寸、小米电视全面屏 Pro 43/55/ 65 英寸、小米透明OLED电视 55 英寸、Redmi 智能电视 MAX 86/ 98 英寸、Redmi 智能电视 X50/X55/X65/X75 ( 2022 款)、小米电视 ES 43/50/55/65/ 75 英寸,使用前请确保将设备软件更新至最新版本,后续将支持更多设备。

  • Redmi K50至尊版是2K屏幕吗?

    不是Redmi K50 至尊版屏幕分辨率是1.5K级别的,不是2K屏幕。它的屏幕分辨率为2712 x 1220(1.5K)。小米高管卢伟冰称此前发现有一部分用户既想要 2K 屏幕的清晰度,又要 FHD 的低功耗,所以提出了 1.5K 直屏的设想。Redmi K50 至尊版的 1.5K 直屏拥有 446PPi 像素密度,且为 Redmi 首款 12bit 屏,高达 687 亿色,同时支持 1920Hz 高频 PWM,硬件级低蓝,并获得 SGS 低视觉疲劳认证手机

  • 小米Watch S1 Pro妙享中心功能怎么开?

    需3.7.0版本小米运动健康。妙享中心功能目前支持 Xiaomi MIX Fold 2、Redmi K50 至尊版手机,并连接绑定3.7.0及以上版本的小米运动健康应用才能显示、启用此功能,触屏控制功能需手机启用妙享中心后方能使用,目前仅支持部分音箱和电视机型的控制。

  • Redmi K50至尊版可以拍摄什么视频?

    最高4K 30 / 60fps视频Redmi K50 至尊版可以拍摄是视频格式有4K 视频拍摄: 30 / 60fps、1080p 视频拍摄:30 / 60fps、1080p 慢动作视频拍摄:120 / 240 / 960fps、720p 视频拍摄:30fps、720p 慢动作视频拍摄:120 / 240 / 960fps

  • 小米Watch S1 Pro有哪些功能?

    有以下这些功能。1.日常活动记录,可以记录日常的一些活动信息。2.健康功能包括心率监测、睡眠监测、压力监测、呼吸训练、血氧检测,这些都是支持安卓和iOS系统的。3.117种运动模式,自动识别运动开始(健走、跑步、划船机、椭圆机、跳绳),支持查看运动轨迹跟踪以及运动能量消耗。4.支持小爱同学语音助手。5.支持微信以及支付宝支付和NFC功能,包括公交卡、门禁卡、空白门卡。6.支持多种应用,包括表盘市场、闹钟、录音、倒计时、天气、找手机、手电筒等。7.支持蓝牙通话、来电提醒、通话降噪。

  • Redmi K50至尊版有光学防抖吗?

    有Redmi K50至尊版主镜头支持OIS 光学防抖,这颗主镜头的参数是1亿像素超清主摄:S5KHM6,1/1.67″感光元件,1.92μm 融合像素,OIS 光学防抖,1G +5P 玻塑混合镜头,f/1.6超大光圈,后置镜头的其他两个镜头参数是800万 像素超广角镜头:120° FOV、200万 像素微距镜头

  • 小米Watch S1 Pro支持华为鸿蒙系统吗?

    不支持。小米Watch S1Pro目前支持的系统版本是Android 6.0 或 iOS 13.0 及以上版本,并没有对华为的鸿蒙系统进行适配,所以是不支持鸿蒙的。华为鸿蒙系统(HUAWEI Harmony OS),是华为公司在2019年8月9日于东莞举行华为开发者大会(HDC.2019)上正式发布的操作系统。华为鸿蒙系统是一款全新的面向全场景的分布式操作系统,创造一个超级虚拟终端互联的世界,将人、设备、场景有机地联系在一起,将消费者在全场景生活中接触的多种智能终端实现极速发现、极速连接、硬件互助、资源共享,用合适的设备提供场景体验。

  • Redmi K50至尊版是DC调光吗?

    不是Redmi K50 至尊版不是DC调光,使用的是1920Hz 高频 PWM 调光,K50 至尊版使用的屏幕是6.67 英寸OLED 柔性直屏,分辨率: 2712 x 1220(1.5K),色彩显示:12bit 对比度:5,000,000:1 显示帧率:最高 120Hz 触控采样率:最高 480Hz

  • 小米Watch S1 Pro支持NFC吗?

    支持。小米Watch S1Pro是支持NFC功能的,其中NFC功能有支付宝扫码支付、微信扫码支付、NFC公交卡、NFC模拟门卡、NFC空白门卡,NFC 门禁卡功能,目前仅能支持模拟市面上频率为13.56MHz但未经加密的门卡,暂时无法模拟带有门卡功能的银行卡和有储值消费功能的门卡。

  • Redmi K50至尊版有屏下指纹解锁吗?

    有Redmi K50 至尊版使用的是屏下指纹解锁方式,它还有红外遥控功能、X轴线性马达、双扬声器,各方面性能在同价位的安卓手机中是比较齐全,性价比比较高。K50 至尊版主要参数是骁龙8 Gen 1 Plus处理器,定制1.5K OLED直屏,120W快充+5000mAh电池,一亿像素OIS光学防抖相机

  • 小米Watch S1 Pro屏幕多大?

    1.47英寸。小米Watch S1Pro采用蓝宝石玻璃镜面 + 不锈钢机身设计,其中屏幕1.47英寸柔性AmOLED直屏,600nit亮度,屏占比72.7% 。柔性屏幕可以让机身减薄0.3mm,这样抠出了30毫安时的空间。电池到了500mAh。磁吸无线快充,85分钟充满。如果真着急,也支持手机反向无线充电给它紧急续命。

  • Redmi K50至尊版有没有无线充电?

    没有Redmi K50 至尊版不支持无线充电,它支持120W 有线快充,手机支持 QC3+ / PD2.0 / PD3.0 快充协议,标配 120W 充电器,兼容 PD 充电协议,手机内置5000mAh(typ)锂离子聚合物电池,另外K50至尊版也不支持反向无线充电

  • 小米Watch S1 Pro支持苹果手机吗?

    支持。小米Watch S1Pro是支持苹果手机的,目前支持的系统是Android 6.0 或 iOS 13.0 及以上版本,也就是说只要你的苹果手机系统达到了iOS13.0就可以连接上小米Watch S1Pro了。iOS13是苹果公司研发的移动端手机操作系统,于北京时间2019年6月4日发布,截至2020年9月2日,iOS13已更新至iOS13.7,iOS13所有版本已完成更新。

  • Redmi K50至尊版散热怎么样?

    3725mm²的大VC板,散热性能不错Redmi K50 至尊版采用了3725mm的大VC板,并且还在VC上加入了导流槽的设计,能够增强热蒸汽流动的方向性,在游戏时的表现也比较不错,王者荣耀等游戏可以支持120帧稳定的画质,原神也可以保持60Hz左右的画面

  • 小米Watch S1 Pro支持蓝牙5.2吗?

    支持。小米Watch S1 Pro是支持蓝牙5.2的,此外Wi-Fi IEEE 802.11b/g/n 2.4GHz(发射功率限值小于10mW(e.i.r.p));802.11a/n 5GHz (工作频段:5150-5350MHz及 5725-5850MHz,其中工作于 5725-5850MHz 频段发射功率限值小于25mW(e.i.r.p))。

  • 小米Watch S1 Pro支持无线充电吗?

    支持。小米Watch S1Pro是支持无线充电的,手表电池充电【方式如下】:1. 将手表放置在充电座上,使手表背部的充电触片与充电座上的金属触点完全贴合;2. 将充电座另一端连接至USB-A充电器。手表电量低于10%,将提示连接充电器充电;充电过程中,将会有充电提示。若手表长时间放置后无法开机,再次使用时需预充1分钟左右才会显示充电图标。

  • Redmi K50至尊版NFC有哪些功能?

    交通卡、Mi Pay、门卡、车钥匙等功能Redmi K50 至尊版NFC可以支持交通卡:支持 300+ 座城市,支持 40+ 张公交卡免费从旧手机迁移至新手机;Mi Pay:支持线上 APP 支付,线下刷卡、银联二维码支付、银联标签碰一碰支付;门卡:实体门卡、智能门锁、社区门卡、自定义空白卡。

  • 小米Watch S1 Pro可以回微信吗?

    不可以。小米Watch S1 Pro目前是不支持微信回复的,官方的商品宣传上也没见到能回复微信的字样,不过可以在小米运动健康APP上设置微信通知,也就是你手机上微信来消息了,手表也是会提示你微信有未读信息。

今日大家都在搜的词: