MySQL按指定字符合并以及拆分實(shí)例教程
前言
按照指定字符進(jìn)行合并或拆分是經(jīng)常碰到的場(chǎng)景,MySQL在合并的寫法上比較簡(jiǎn)單,但是按指定字符拆分相對(duì)比較麻煩一點(diǎn)(也就是要多寫一些字符)。本文將舉例演示如何進(jìn)行按照指定字符合并及拆分。
1、 合并
MySQL數(shù)據(jù)庫中按照指定字符合并可以直接用group_concat來實(shí)現(xiàn)。
創(chuàng)建測(cè)試表
mysql> create table tb_group(id int auto_increment primary key ,col1 varchar(20)); Query OK, 0 rows affected (0.01 sec)
插入測(cè)試數(shù)據(jù)
mysql> insert into tb_group(col1) values('a'),('c'),('dddd'),('ewdw'),('vxgdh');; Query OK, 5 rows affected (0.01 sec) Records: 5 Duplicates: 0 Warnings: 0
合并col1字段的內(nèi)容
默認(rèn)是按照逗號(hào)進(jìn)行合并的,例如:
mysql> select group_concat(col1) from tb_group; +---------------------+ | group_concat(col1) | +---------------------+ | a,c,dddd,ewdw,vxgdh | +---------------------+ 1 row in set (0.01 sec)
指定分隔符合并,例如指定使用 || 符號(hào)進(jìn)行合并
mysql> select group_concat(col1,'||') from tb_group; +-------------------------------+ | group_concat(col1,'||') | +-------------------------------+ | a||,c||,dddd||,ewdw||,vxgdh|| | +-------------------------------+ 1 row in set (0.00 sec)
注意
默認(rèn)情況下,合并后的長(zhǎng)度不能超過1024,否則結(jié)果會(huì)被截?cái)?/p>
例如,我再寫個(gè)腳本插入一些數(shù)據(jù)
# 使用shell腳本來實(shí)現(xiàn) vim test_insert.sh # 添加如下內(nèi)容 #!/bin/bash # gjc for i in {1..1025} do mysql -uroot -p'123456' --socket=/data/mysql3306/tmp/mysql.sock -e "insert into testdb.tb_group1(col1)values('a') " done # 運(yùn)行腳本插入數(shù)據(jù) sh test_insert.sh
mysql> select count(*)from tb_group; +----------+ | count(*) | +----------+ | 1030 | +----------+ 1 row in set (0.00 sec)
再進(jìn)行合并
mysql> select group_concat(col1)cols, length(group_concat(col1)) col_len from tb_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: 1024 1 row in set, 2 warnings (0.01 sec)
可以看出,結(jié)果中總長(zhǎng)度字節(jié)只有1024
對(duì)于這種情況,實(shí)際使用時(shí)肯定是不滿足的,如何解決呢?其實(shí)此長(zhǎng)度與MySQL數(shù)據(jù)庫的group_concat_max_len參數(shù)有直接關(guān)系(默認(rèn)為1024)
mysql> show global variables like 'group_concat_max_len'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | group_concat_max_len | 1024 | +----------------------+-------+ 1 row in set (0.08 sec)
那我們調(diào)整一下參數(shù)看看
/* 修改全局參數(shù),這樣所有的新連接都會(huì)生效 */ mysql> set global group_concat_max_len=102400; Query OK, 0 rows affected (0.01 sec) /* 修改本會(huì)話參數(shù),這樣當(dāng)前連接不用退出也可以生效 */ mysql> set session group_concat_max_len=102400; Query OK, 0 rows affected (0.00 sec) mysql> show global variables like 'group_concat_max_len'; +----------------------+--------+ | Variable_name | Value | +----------------------+--------+ | group_concat_max_len | 102400 | +----------------------+--------+ 1 row in set (0.00 sec) mysql> show variables like 'group_concat_max_len'; +----------------------+--------+ | Variable_name | Value | +----------------------+--------+ | group_concat_max_len | 102400 | +----------------------+--------+ 1 row in set (0.01 sec)
再合并一下看看
mysql> select group_concat(col1)cols, length(group_concat(col1)) col_len from tb_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: 2069 1 row in set (0.01 sec)
這樣結(jié)果就對(duì)了。因此生產(chǎn)環(huán)境中 該參數(shù)建議調(diào)整為合適的大小。
(Tips:Oracle數(shù)據(jù)庫中可以使用listagg或wm_concat等多種方式實(shí)現(xiàn),也比較簡(jiǎn)單,可以自行測(cè)試)
2、 拆分
按指定字符拆分字符串,也是比較常見的場(chǎng)景。但是MySQL數(shù)據(jù)庫中字符串的拆分沒有其他數(shù)據(jù)庫那么方便(其他數(shù)據(jù)庫直接有拆分函數(shù)),且需要借助mysql庫中的mysql.help_topic表來輔助實(shí)現(xiàn)。例子如下:
創(chuàng)建測(cè)試表及數(shù)據(jù)
mysql> create table tb_split(id int primary key auto_increment,col1 varchar(20)); Query OK, 0 rows affected (0.01 sec) mysql> insert into tb_split(col1) values('a,b,c,d'),('c,a,g,h'); Query OK, 2 rows affected (0.01 sec) Records: 2 Duplicates: 0 Warnings: 0
按照逗號(hào)拆分
mysql> SELECT a.id, substring_index(substring_index(a.col1, ',', b.help_topic_id + 1), ',',- 1) NAME FROM tb_split a JOIN mysql.help_topic b ON b.help_topic_id < (length(a.col1) - length(REPLACE(a.col1, ',', '')) + 1); +----+------+ | id | NAME | +----+------+ | 1 | a | | 1 | b | | 1 | c | | 1 | d | | 2 | c | | 2 | a | | 2 | g | | 2 | h | +----+------+ 8 rows in set (0.00 sec)
這樣也就實(shí)現(xiàn)了拆分。
按指定字符拆分
如果是其他分隔符的,修改瑞陽的分隔符字段即可。
mysql> insert into tb_split(col1) values('a|v|f'); Query OK, 1 row affected (0.00 sec) mysql> select * from tb_split; +----+---------+ | id | col1 | +----+---------+ | 1 | a,b,c,d | | 2 | c,a,g,h | | 3 | a|v|f | +----+---------+ 3 rows in set (0.01 sec) mysql> SELECT a.id, substring_index(substring_index(a.col1, '|', b.help_topic_id + 1), '|',- 1) col_split FROM tb_split a JOIN mysql.help_topic b ON b.help_topic_id < (length(a.col1) - length(REPLACE(a.col1, '|', '')) + 1) where a.id=3; +----+-----------+ | id | col_split | +----+-----------+ | 3 | a | | 3 | v | | 3 | f | +----+-----------+ 3 rows in set (0.00 sec)
這樣就完成按照指定字符的合并及拆分了。
3、 結(jié)語
本文介紹了MySQL常用的合并及拆分方法,對(duì)于擅長(zhǎng)寫SQL的同學(xué)也可以使用其他方式實(shí)現(xiàn),以便解決權(quán)限不足(例如拆分時(shí)需要使用mysql庫的help_topic表的權(quán)限)等情況下的需求。
到此這篇關(guān)于MySQL按指定字符合并以及拆分的文章就介紹到這了,更多相關(guān)MySQL指定字符合并及拆分內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySql 5.7.17 winx64的安裝配置詳細(xì)教程
這篇文章主要介紹了MySql 5.7.17 winx64的安裝配置教程,初始化數(shù)據(jù)庫、配置相關(guān)信息的方法在本文中介紹的非常詳細(xì),需要的朋友參考下2017-01-01云服務(wù)器Ubuntu_Server_16.04.1安裝MySQL并開啟遠(yuǎn)程連接的方法
這篇文章主要介紹了云服務(wù)器Ubuntu_Server_16.04.1安裝MySQL并開啟遠(yuǎn)程連接的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02Mysql 實(shí)現(xiàn)向上遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu)的示例代碼
通過mysql 8.0以下版本實(shí)現(xiàn),一個(gè)人多角色id,一個(gè)角色對(duì)應(yīng)某個(gè)節(jié)點(diǎn)menu_id,根節(jié)點(diǎn)的父節(jié)點(diǎn)存儲(chǔ)為NULL, 向上遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu),今天通過本文給大家介紹Mysql遞歸查找父節(jié)點(diǎn)并返回樹結(jié)構(gòu),感興趣的朋友一起看看吧2022-09-09mysql日期函數(shù)TO_DAYS()函數(shù)的詳細(xì)講解
在SQL中我們經(jīng)常需要根據(jù)時(shí)間字段查詢數(shù)據(jù),今天用到一個(gè)好用的時(shí)間字段,用來查詢一整天的數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于mysql日期函數(shù)TO_DAYS()函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-08-08mysql中g(shù)roup by與having合用注意事項(xiàng)分享
在mysql中g(shù)roup by分組查詢我們經(jīng)常會(huì)用到,并且還同時(shí)會(huì)與having合用,下面我介紹group by用法與having合用注意事項(xiàng),希望此教程對(duì)各位朋友有所幫助2013-10-10MySQL Version確認(rèn)問題(版本確認(rèn))
這篇文章主要介紹了MySQL Version確認(rèn)問題(版本確認(rèn)),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-12-12