# 前言
记录一些曾经用过的 mysql 语句,方便日后查询
# substring_index
# 参数
substring_index(string,sep,num)
string:被分割的字符串
sep:分割符
num:提取第 N 个分割后的字符串,值不能为 0。正数表示从左到右,负数表示从右到左
# sql
select sd.sodetailid,so.orderno,so.code,sd.printnum,sd.printprice, | |
SUBSTRING_INDEX(SUBSTRING_INDEX(sd.productcontent,'public_style:',-1),'}{',1) public_style, | |
SUBSTRING_INDEX(SUBSTRING_INDEX(sd.productcontent,'productsize:',-1),'}{',1) productsize, | |
SUBSTRING_INDEX(SUBSTRING_INDEX(sd.productcontent,'public_unit:',-1),'}{',1) public_unit | |
from so_detail sd | |
inner join so on so.orderid=sd.orderid | |
where so.createdate>'2022-01-01 00:00:00' and so.createdate<='2023-01-01 00:00:00' |
# 说明
有一天 Boss 让我统计近几年的订单数据给他。但是有一些关键数据放在了一个格式有点特殊的字段里,像这样:
Printnum:5000}{public_type:Leaflet(128g art paper)}{public_style:A4}{public_unit:Double side(4C+4C)}{public_kind:1}{public_price:311.9}{productsize:210mmx297mm}{poundtype:128gGlossy Art paper}{public_typeset:}{public_docpath:filesystem}{
我要提取的是这个字段里面的 public_style
的值 A4
,于是用到了 substring_index
函数
首先先用 public_style:
做第一次分割,拿到两个字符串
第一条: Printnum:5000}{public_type:Leaflet(128g art paper)}{
第二条: A4}{public_unit:Double side(4C+4C)}{public_kind:1}{public_price:311.9}{productsize:210mmx297mm}{poundtype:128gGlossy Art paper}{public_typeset:}{public_docpath:filesystem}{
num
参数传入 -1
,可以返回分割后从右往左的第一个字符串,也就是上面的第二条
select SUBSTRING_INDEX('Printnum:5000}{public_type:Leaflet(128g art paper)}{public_style:A4}{public_unit:Double side(4C+4C)}{public_kind:1}{public_price:311.9}{productsize:210mmx297mm}{poundtype:128gGlossy Art paper}{public_typeset:}{public_docpath:filesystem}{','public_style:',-1) public_style |
接着再用 }{
做第二次分割,获得 public_style
的值 A4
。 num
参数传入 1
,返回从左到右第一条
select SUBSTRING_INDEX(SUBSTRING_INDEX('Printnum:5000}{public_type:Leaflet(128g art paper)}{public_style:A4}{public_unit:Double side(4C+4C)}{public_kind:1}{public_price:311.9}{productsize:210mmx297mm}{poundtype:128gGlossy Art paper}{public_typeset:}{public_docpath:filesystem}{','public_style:',-1),'}{',1) public_style |