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

吾爱主题 阅读:116 2024-04-02 08:00:18 评论:0

前言

备注:测试数据库版本为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

可以去百度分享获取分享代码输入这里。
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

【腾讯云】云服务器产品特惠热卖中
搜索
标签列表
    关注我们

    了解等多精彩内容