当前位置: 首页 > 编程笔记 >

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

胡昊
2023-03-14
本文向大家介绍MySQL如何从不固定位置提取字符串元素详解,包括了MySQL如何从不固定位置提取字符串元素详解的使用技巧和注意事项,需要的朋友参考一下

前言

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

测试数据:

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个标签,需要输出如下:

mysql> select * from zqs;
±-----±----------------------------------------------------+
| id | str |
±-----±----------------------------------------------------+
| 1 | 【京东】abc【中国电信】 |
| 1 | 【京东】abc【中国电信】def |
| 1 | ****【京东】abc【中国电信】def |
| 1 | ****【京东】abc |
| 1 | 【京东】abc【中国电信】【中国联通】 |
±-----±----------------------------------------------------+

要求输出如下:

±-------------±-------------------±-------------------+
| first_val | first_va2 | first_va3 |
±-------------±-------------------±-------------------+
| 【京东】 | 【中国电信】 | |
| 【京东】 | 【中国电信】 | |
| 【京东】 | 【中国电信】 | |
| 【京东】 | | |
| 【京东】 | 【中国电信】 | 【中国联通】 |
±-------------±-------------------±-------------------+

二.解决方案

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

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

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;

测试记录:

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提取字符串元素内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!

 类似资料:
  • 问题内容: 我想创建一个以动态宽度和高度为中心的弹出框。我曾经为此。没有它,则水平居中,但不能垂直居中。添加后,它甚至没有水平居中。 这是完整的设置: 如何使用CSS在屏幕上将此框居中? 问题答案: 基本上,您需要设置div 并将其居中放置在div的左上角。您还需要将和设置为div的高度和宽度的负一半,以将中心移到div的中间。 因此,在提供(标准模式)的情况下,此操作应: 或者,如果你不关心垂直

  • 我想为一个笔记应用程序添加笔记加号。我做了一个固定位置的圆,这样它总是可见的。然后,我想做两条线,形成一个加号,并将这些线居中。这是代码: null null 请告诉我如何将加号居中到固定位置的圆上。谢谢!

  • 问题内容: 如果我有一个XML文档,例如 我想获取带有第一个子元素的XML字符串。我的输出字符串是 有很多方法,想看看一些想法。我一直在尝试使用Java XML API,但尚不清楚有没有很好的方法来做到这一点。 谢谢 问题答案: 没错,使用标准XML API并不是一种好方法-这是一个示例(可能是bug缠身;它可以运行,但是我很久以前就写了)。 似乎您可以仅使用doc.getDocumentElem

  • 问题内容: 这是我要完成的工作: 我需要一个按钮,该按钮与div的右侧保持一定距离,并且无论视口的大小如何,该按钮始终与div的侧面保持相同的距离,但是会随窗口滚动。 因此,始终是div右侧的x像素,而始终是视口顶部的y像素。 这可能吗? 问题答案: 水平放置固定元素(基于另一个元素) ( 免责声明 :此处提供的解决方案在技术上并非如问题标题所述为“绝对水平 ”,而是实现了OP最初想要的功能,固定

  • 我有一个字符串的格式: 其中A,B,C,D将是整数。我想从这个字符串中提取A,B,C,D。A、B、C、D可以是单位数或多位数的整数,我现在并不真正关心验证(比如C、D理想情况下在0到59之间),因为这可以在以后处理。 在Java中实现这一点的最佳方法是什么?

  • 问题内容: 我已经有一段时间了,这似乎是一个Chrome重绘错误,尚未修复。因此,我正在寻找任何权宜之计。 主要问题是页面上的元素具有使用以下内容的背景图像时: 如果另一个元素固定并具有子视频元素,则它将导致具有背景图像的元素消失。 现在,它可以在Safari(以及Firefox和IE)中正常运行,因此这并不是Webkit的问题。我已经应用了一些没有用的建议属性。 目前,我的解决方案只是通过媒体查