mysql使用SUBSTRING_INDEX截取部分字符串

这篇博客介绍如何在MySQL中使用SUBSTRING_INDEX函数从JSON字段中提取特定信息,特别是针对orderSn的需求。文中提供了两种方法,一种是直接使用SUBSTRING_INDEX,另一种是SUBSTR或SUBSTRING,前提orderSn的值长度固定。还分享了2020年的面试题资源。

需求
数据库中有个字段存取的接口返回的JSON数据,现在需要取出JSON数据中部分信息,数据格式如下,要取出orderSn对应的数据

{"data":{"orderSn":"D21031315340867693","payUrl":"https://...","cOrderSnMap":{"年夜饭礼盒":"WD211414589349"}},"success":true,"totalCount":0}

方法一:使用SUBSTRING_INDEX
1.格式:

SUBSTRING_INDEX(str, delimiter, number)

2.详细解释

返回从字符串 str 的第 number 个出现的分隔符 即delimiter 之后的字符串。
如果 number 是正数,则返回从str左边开始计数的第 number 个delimiter(不包含delimiter)左边的字符串。
如果 number 是负数,则返回从str右边开始计数的第(number 的绝对值)个delimiter(不包含delimiter)右边的字符串。
SELECT SUBSTRING_INDEX('a*b','*',1) -- 结果a
SELECT SUBSTRING_INDEX('a*b','*',-1)    -- 结果b
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX('a*b*c*d*e','*',3),'*',-1)    -- 结果c。SUBSTRING_INDEX('a*b*c*d*e','*',3)的结果是a*b*c

3.所以可以这样操作

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(result,'"',6),'"',-1);

result就是上面示例的JSON,得出的结果就是D21031315340867693

方法二:使用SUBSTR或者SUBSTRING,前提是orderSn的值长度一致
1.格式

SUBSTR(str, start, length)
SUBSTRING(str, start, length)

2.详细解释

从字符串 str 的 start 位置(包含start位置)截取长度为 length 的子字符串

3.具体的操作

SELECT SUBSTR(result,21,18) ;
SELECT SUBSTRING(result,21,18) ;
result就是上面示例的JSON,上述两个的结果也都是D21031315340867693

image
最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:909038429
/./*欢迎加入java交流Q君样:909038429一起吹水聊天

<think>好的,我现在要处理用户关于MySQLSUBSTRING_INDEX函数的问题。首先,我需要回顾一下用户的历史对话。之前用户问过MySQL 5.6.16如何处理JSON数组,我解释了存储和手动解析的方法,其中提到了SUBSTRING_INDEX函数。现在用户直接询问这个函数的具体用法,可能需要更详细的解释。 用户可能在使用MySQL处理字符串,特别是像JSON数组这样的结构化数据,但由于版本限制,只能用字符串函数来解析。他们可能遇到了分割字符串的需求,比如从逗号分隔的值中提取特定部分。因此,用户需要了解SUBSTRING_INDEX如何工作,以及实际应用场景。 接下来,我需要确认SUBSTRING_INDEX的功能。这个函数用于根据分隔符截取字符串的一部分。基本语法是SUBSTRING_INDEX(str, delim, count)。当count为正数时,从左往右数,取前count个分隔符之前的部分;负数则从右往左。例如,处理"a,b,c,d",count为2时得到"a,b",-2得到"c,d"。 用户可能需要具体的例子来理解,比如分割邮箱的用户名和域名,或者处理CSV数据。同时,需要注意常见问题,比如分隔符重复或不存在的情况,以及性能问题。此外,结合之前的JSON解析案例,可以展示如何用SUBSTRING_INDEX解析JSON数组,尽管在旧版本中没有原生支持。 还要提醒用户这个函数的使用限制,比如不支持正则表达式,多次调用可能需要嵌套。同时,对比其他函数如SUBSTRING、LOCATE,说明SUBSTRING_INDEX的优势和适用场景。 最后,确保回答结构清晰,步骤明确,帮助用户解决实际问题。可能用户需要的是实际应用中的指导,而不仅仅是语法说明,所以提供示例和注意事项会更实用。</think>--- ### `SUBSTRING_INDEX` 函数详解 `SUBSTRING_INDEX` 是 MySQL 中用于**按分隔符截取字符串**的核心函数,特别适合处理分隔符规则明确的文本(如 CSV、路径、JSON 伪解析等)。 --- ### 一、语法与参数 ```sql SUBSTRING_INDEX(str, delim, count) ``` - **`str`**:原始字符串(需处理的字段或表达式)。 - **`delim`**:分隔符(单字符或多字符,区分大小写)。 - **`count`**:截取方向与次数: - **正数**:从左往右截取前 `count` 个分隔符左侧内容。 - **负数**:从右往左截取前 `|count|` 个分隔符右侧内容。 --- ### 二、使用场景与示例 #### 1. **基础截取** ```sql SELECT SUBSTRING_INDEX('www.mysql.com', '.', 2) AS case1, --> 'www.mysql' SUBSTRING_INDEX('www.mysql.com', '.', -1) AS case2; --> 'com' ``` #### 2. **提取邮箱域名** ```sql SELECT email, SUBSTRING_INDEX(email, '@', -1) AS domain -- 提取"@"后的内容 FROM users; ``` #### 3. **伪解析JSON数组(MySQL 5.6)** 若字段 `data` 存储类似 `'["apple","banana","cherry"]'` 的JSON数组: ```sql -- 提取第二个元素(索引1) SELECT SUBSTRING_INDEX( SUBSTRING_INDEX( REPLACE(REPLACE(data, '[', ''), ']', ''), -- 去方括号 ',', 2 -- 截取前2段 ), ',', -1 -- 取最后一段 ) AS element_1 FROM table; ``` 输出:`"banana"`(需注意保留引号,需进一步用`REPLACE`清理)。 --- ### 三、特殊场景处理 #### 1. **分隔符重复** 若字符串为 `'a,,b,c'`,分隔符为 `,`: ```sql SELECT SUBSTRING_INDEX('a,,b,c', ',', 3) --> 'a,,b' (空字段仍占位) ``` #### 2. **分隔符不存在** 若字符串不含分隔符,直接返回原字符串: ```sql SELECT SUBSTRING_INDEX('hello_world', '.', 1); --> 'hello_world' ``` #### 3. **多层嵌套截取** 提取路径最后一级: ```sql SELECT SUBSTRING_INDEX( SUBSTRING_INDEX('/var/www/html/index.php', '/', -2), --> 'html/index.php' '/', 1 --> 'html' ); ``` --- ### 四、注意事项 1. **性能问题** 大量数据时频繁调用可能影响性能,建议结合其他函数(如 `LEFT`, `RIGHT`)优化。 2. **数据清洗** 截取后可能残留分隔符或空格,需配合 `TRIM` 或 `REPLACE` 处理: ```sql SELECT TRIM(' "banana" '); --> "banana" ``` 3. **不支持正则** 分隔符仅支持固定字符串,无法使用正则表达式。 --- ### 五、对比其他函数 | 函数 | 用途 | 与 `SUBSTRING_INDEX` 的区别 | |---------------------|-----------------------------|-------------------------------------| | `SUBSTRING(str, pos, len)` | 按位置截取子串 | 需明确起始位置和长度,不适合动态分隔场景 | | `LOCATE(substr, str)` | 查找子串位置 | 需配合 `SUBSTRING` 实现类似功能 | | `SPLIT_STR`(非内置函数) | 自定义分隔符分割字符串 | MySQL 需手动实现,`SUBSTRING_INDEX` 更简单 | --- ### 总结 - `SUBSTRING_INDEX` 是处理**规则分隔文本**的高效工具,但需注意数据格式的严格性。 - 在低版本 MySQL 中,可配合字符串函数模拟 JSON/CSV 解析,但复杂场景建议升级版本或使用应用层处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值