当前位置:网站首页>Mysql提取表字段中的字符串
Mysql提取表字段中的字符串
2022-06-30 02:51:00 【慕城南风】
目录
前言
最新生产上遇到一批订单没有给下游推送数据,为了批量补推数据,需要拿到表中的物流单号(waybillCode字段),但是物流单号放在了notify_data中,因此需要提取表该字段中的物流单号。notify_data字段定义如下:

字段内容示例如下:
data={"bizType":"COLLECT_STATUS|CHARGE_INFO","collectInfo":{"chargeFee":{"addWeightFee":0,"basicFee":700,"claimFee":850,"declaredFee":0,"insuredFee":0,"majorFee":850,"packageFee":0,"paymentFee":0,"sumFee":850},"collectStatus":"CHARGED","netCode":"551QA","netName":"海德公馆速运营业点"},"common":{"accessKey":"5bBNfCYTFIdwFtxZYSCyiiLryzh08Erv","apiVersion":"2021-02-01","signature":"212b22a1a7212d51b692b6e80e4e50d34bf8cedb357d0f131d91b8f21a98a89b","timestamp":"1646961313","traceId":"b0a5d324d1a94b32989eb906c9b314c5"},"orderId":"LBF00000000007220891082023","waybillCode":"SF1344113109297"}初步的想法是看看通过SQL能不能直接提取字段内容。
查询资料发现mysql没有split这样的分割函数,这时候我们就会用到另一种函数了,substring_index()。
1. substring_index()字符串提取
substring_index(column_name,split_char,num)
取column_name列以split_char符号为分隔符的前num个字符。
举例:假设table1表column_name列只有一行数据,值为“a-b-c”,通过本函数进行分割,获取(“a”,“b”,“c”)三列。
select SUBSTRING_INDEX(column_name,"-",1),
SUBSTRING_INDEX(SUBSTRING_INDEX(column_name,"-",2),",",-1),
SUBSTRING_INDEX(column_name,"-",-1) from table1最后的SQL如下:
SELECT
id,notify_dim_val,notify_data,notify_response,SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(notify_data,',',-1),':',-1),'"',2),'"',-1)
FROM
`otms_notify_message`
WHERE
id = 33117
AND notify_response LIKE '%claimFee is greater than maxClaimAmount%'查询结果如下图:

2. 其他函数
2.1 字符串提取
1. substr()与substring()
substr()与substring()目前只涉及到下面两种用法:
substr(data,start)/substring(data,start)
substr(data,start,length)/substring(data,start,length)由于substr()与substring()的用法是完全一样的,所以下面以substr()进行举例
示例:查找提取某一列数据中最后两个位置的字符
现有一张表table1里面由一列字符串列str1,我们需要找到这个字符串列中每行字符串中最后两个字符的个数。比如某一行字符为“first-str”,那么就提取出tr。
substr(data,start)代码如下:
select substr(str1, -2) from table1
输出:tr
substr(data,start,length)代码如下:
select substr(str1, 2, 2) from table1
输出:ir2. left()
left(data,length)取date的前length个字符。
3. right()
rigth(data,length)取date的后length个字符。
4. like()与rlike()
like():不是正则,而是通配符。用到“%”时意思是代表任意多个字符;
rlike():使用的是正则,需要使用转义符,例如匹配“\”时需要使用“\”。
当我们取某字符串类型列"column1"中含有‘a’字符的所有记录时,使用like语句或者rlike语句。
where column1 like '%a%'
where column1 rlike '[a]'2.2 字符串长度
本节内容都将计算str1:算bilibili00长度
1. length()
获取字符串的占位大小,一个汉字占三个字符,一个数字或字母占一个字符。
length(str1)
输出:
192. char_length()/character_length()
char_length(str1)
character_length(str1)
输出:
133. bit_length()
一个汉字或者特殊字符的二进制长度为24,数字或字母的二进制长度为8
bit_length(str1)
输出:
1522.3 使用正则
首先我们建立一张带有逗号分隔的字符串。
CREATE TABLE test(id int(6) NOT NULL AUTO_INCREMENT,PRIMARY KEY (id),pname VARCHAR(20) NOT NULL,pnum VARCHAR(50) NOT NULL);
然后插入带有逗号分隔的测试数据
INSERT INTO test(pname,pnum) VALUES('产品1','1,2,4');
INSERT INTO test(pname,pnum) VALUES('产品2','2,4,7');
INSERT INTO test(pname,pnum) VALUES('产品3','3,4');
INSERT INTO test(pname,pnum) VALUES('产品4','1,7,8,9');
INSERT INTO test(pname,pnum) VALUES('产品5','33,4');
1. 查找pnum字段中包含3或者9的记录
MySQL> SELECT * FROM test WHERE find_in_set('3',pnum) OR find_in_set('9',pnum);
+----+-------+---------+
| id | pname | pnum |
+----+-------+---------+
| 3 | 产品3 | 3,4 |
| 4 | 产品4 | 1,7,8,9 |
+----+-------+---------+
2 rows in set (0.03 sec)
2. 使用正则
mysql> SELECT * FROM test WHERE pnum REGEXP '(3|9)';
+----+-------+---------+
| id | pname | pnum |
+----+-------+---------+
| 3 | 产品3 | 3,4 |
| 4 | 产品4 | 1,7,8,9 |
| 5 | 产品5 | 33,4 |
+----+-------+---------+
3 rows in set (0.02 sec)
这样会产生多条记录,比如33也被查找出来了。
换一种方式
mysql> SELECT * FROM test WHERE CONCAT(',',pnum,',') REGEXP '[^0-9]+[3|9][^0-9]+';
+----+-------+---------+
| id | pname | pnum |
+----+-------+---------+
| 3 | 产品3 | 3,4 |
| 4 | 产品4 | 1,7,8,9 |
+----+-------+---------+
2 rows in set (0.01 sec)
3. select * from oa_student_archives where CONCAT(',',pe_projects,',') like '%,11,%';
这种方式也可以。
注意:
标红的mysql> SELECT * FROM test WHERE CONCAT(',',pnum,',') REGEXP '[^0-9]+[3|9][^0-9]+';
这种,当时小于10的数据搜索是可以的,但是如果是大于10的,则不能用.
总结如下:
1、select * from oa_student_archives where CONCAT(',',pe_projects,',') like '%,11,%';
2、select * from oa_student_archives where find_in_set('12', pe_projects);
以上的两个都可以用。
边栏推荐
- Threejs mirror case reflector create mirror + house construction + small ball movement
- 怎么使用Vant实现数据分页和下拉加载
- CMake教程系列-02-使用cmake代码生成二进制
- Pytoch learning (II)
- Azure 开发者新闻快讯丨开发者6月大事记一览
- Raki's notes on reading paper: neighborhood matching network for entity alignment
- Two methods of SSL certificate format conversion
- Global and Chinese market of relay lens 2022-2028: Research Report on technology, participants, trends, market size and share
- What is a self signed certificate? Advantages and disadvantages of self signed SSL certificates?
- 2. successfully solved bug:exception when publishing [Failed to connect and initialize SSH connection...
猜你喜欢

How vscode debugs into standard library files / third-party package source code

如何在 JupyterLab 中把 ipykernel 切换到不同的 conda 虚拟环境?

并发请求下如何防重复提交

2. successfully solved bug:exception when publishing [Failed to connect and initialize SSH connection...

What is the concept of string in PHP

JMeter obtains cookies across thread groups or JMeter thread groups share cookies

Unity3d ugui force refresh of layout components

Study diary: February 15, 2022

最小栈详解

What should academic presentation /ppt do?
随机推荐
C语言 pivot_root的Invalid argument错误解决方案
[on] [DSTG] dynamic spatiotemporalgraph revolutionary neural networks for traffic data impact
原生JS怎么生成九宫格
重磅来袭--UE5的开源数字孪生解决方案
Unity3D UGUI强制刷新Layout(布局)组件
Entering Jiangsu writers and poets carmine Jasmine World Book Day
Pytorch学习(二)
Intel hex, Motorola S-Record format detailed analysis
What files does a CA digital certificate contain? How to view SSL certificate information?
RAII内存管理
Recursion frog jumping steps problem
Série de tutoriels cmake - 02 - génération de binaires à l'aide du Code cmake
What are the three paradigms of database
JMeter obtains cookies across thread groups or JMeter thread groups share cookies
VScode如何Debug(调试)进入标准库文件/第三方包源码
NPDP产品经理国际认证考试报名有什么要求?
JvxeTable子表记录加载完毕事件
Global and Chinese market of mobile commerce solutions 2022-2028: Research Report on technology, participants, trends, market size and share
A quick look at the statistical data of 23 major cyber crimes from 2021 to 2022
IBM WebSphere channel connectivity setup and testing