服务器之家

服务器之家 > 正文

MySQL如何从不固定位置提取字符串元素详解

时间:2021-04-19 17:57     来源/作者:只是甲

前言

备注:测试数据库版本为MySQL 8.0

测试数据:

?
1
2
3
4
5
6
7
create table zqs(id int,str varchar(1000));
 
insert into zqs(id,str) values (1,'【京东】abc【中国电信】');
insert into zqs(id,str) values (1,'【京东】abc【中国电信】def');
insert into zqs(id,str) values (1,'****【京东】abc【中国电信】def');
insert into zqs(id,str) values (1,'****【京东】abc');
insert into zqs(id,str) values (1,'【京东】abc【中国电信】【中国联通】');

一.需求

经常遇到短信类似的需求,需要提取短信的标记信息,但是可能会存在多个短信标记

此例假设最多有3个标签,需要输出如下:

?
1
2
3
4
5
6
7
8
9
10
mysql> select * from zqs;
±-----±----------------------------------------------------+
| id | str |
±-----±----------------------------------------------------+
| 1 | 【京东】abc【中国电信】 |
| 1 | 【京东】abc【中国电信】def |
| 1 | ****【京东】abc【中国电信】def |
| 1 | ****【京东】abc |
| 1 | 【京东】abc【中国电信】【中国联通】 |
±-----±----------------------------------------------------+

要求输出如下:

?
1
2
3
4
5
6
7
8
9
±-------------±-------------------±-------------------+
| first_val | first_va2 | first_va3 |
±-------------±-------------------±-------------------+
| 【京东】 | 【中国电信】 | |
| 【京东】 | 【中国电信】 | |
| 【京东】 | 【中国电信】 | |
| 【京东】 | | |
| 【京东】 | 【中国电信】 | 【中国联通】 |
±-------------±-------------------±-------------------+

二.解决方案

Oracle 字符串截取函数 substr和instr配合使用即可,但是MySQL的instr函数是弱于Oracle的instr函数。

此时需要借助MySQL的正则表达式 regexp_instr函数以及substr函数配合

?
1
2
3
4
5
6
7
8
9
10
select substr(str,
   regexp_instr(str,'【',1,1),
   regexp_instr(str,'】',1,1) - regexp_instr(str,'【',1,1) + 1 ) first_val,
  substr(str,
   regexp_instr(str,'【',1,2),
   regexp_instr(str,'】',1,2) - regexp_instr(str,'【',1,2) + 1) first_va2,
  substr(str,
   regexp_instr(str,'【',1,3),
   regexp_instr(str,'】',1,3) - regexp_instr(str,'【',1,3) + 1) first_va3
 from zqs;

测试记录:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
mysql> select substr(str,
 ->   regexp_instr(str,'【',1,1),
 ->   regexp_instr(str,'】',1,1) - regexp_instr(str,'【',1,1) + 1 ) first_val,
 ->   substr(str,
 ->   regexp_instr(str,'【',1,2),
 ->   regexp_instr(str,'】',1,2) - regexp_instr(str,'【',1,2) + 1) first_va2,
 ->   substr(str,
 ->   regexp_instr(str,'【',1,3),
 ->   regexp_instr(str,'】',1,3) - regexp_instr(str,'【',1,3) + 1) first_va3
 -> from zqs;
+--------------+--------------------+--------------------+
| first_val | first_va2   | first_va3   |
+--------------+--------------------+--------------------+
| 【京东】  | 【中国电信】  |     |
| 【京东】  | 【中国电信】  |     |
| 【京东】  | 【中国电信】  |     |
| 【京东】  |     |     |
| 【京东】  | 【中国电信】  | 【中国联通】  |
+--------------+--------------------+--------------------+
5 rows in set (0.00 sec)

总结

到此这篇关于MySQL如何从不固定位置提取字符串元素的文章就介绍到这了,更多相关MySQL提取字符串元素内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/u010520724/article/details/114261191

标签:

相关文章

热门资讯

2022年最旺的微信头像大全 微信头像2022年最新版图片
2022年最旺的微信头像大全 微信头像2022年最新版图片 2022-01-10
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
暖暖日本高清免费中文 暖暖在线观看免费完整版韩国
暖暖日本高清免费中文 暖暖在线观看免费完整版韩国 2021-05-08
返回顶部