# 前言

记录一些曾经用过的 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

image

接着再用 }{ 做第二次分割,获得 public_style 的值 A4num 参数传入 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

image

阅读次数