MySQL字符数据查询拆分

MySQL字符数据查询拆分

问题描述

数据表中某字段为特定单词组字符串,特定字符分隔。
现有需求在不影响原始数据的情况下,查询显示拆分后的单词,方便后续对其进行后续操作。

演示

演示数据源

    -- 测试表结构create table word_table(words varchar(255) null);-- 表数据INSERT INTO test.word_table(words) VALUES ('apple,orange,lemon');INSERT INTO test.word_table(words) VALUES ('computer,apple');INSERT INTO test.word_table(words) VALUES ('laddy,man,woman');

涉及MySQL内置表/内置函数

MySQL内置表
  • mysql.help_topic

    mysql.help_topic本身是Mysql的一张信息表,用来存储各种注释等帮助信息。这里需要借助该表中的help_topic_id字段数据,其有特点:help_topic_id 从0开始,固定数量的(和数据库版本有关),我这里为0~699。

        -- 查看help_topic_id序列总数SELECT help_topic_id FROM mysql.help_topic ORDER BY help_topic_id ASC
    
    -- 测试
    SELECT help_topic_id FROM mysql.help_topic WHERE help_topic_id<2
    
    +---------------+
    | help_topic_id |
    +---------------+
    |             0 |
    |             1 |
    +---------------+
    2 rows in set (0.00 sec)
    
内置函数
  • LENGTH(str)

    返回str中的字符个数

  • REPLACE(str, old_sub_str, new_sub_str)

    替换str中 旧的子字串 为 新的子字符串

  • SUBSTRING_INDEX(str, sub_str, count)

    返回 str 中 第 count 次 查找到 sub_str 之前的字符串,不包含最后一次查找到的sub_str

    如:SUBSTRING_INDEX("a,b,a,c,a,d",'a',3) ==> "a,b,a,c,"

    注意如果count为负数,则表示从右边查找,并返回右边的字符串

    mysql> -- 拆分单词
    mysql> -- SUBSTRING_INDEX(str, sub_str, count):在str中查找delim,返回查找到的第count个sub_str之前的字符串(从左开始)
    mysql> -- 如果count为负数,则从右开始
    mysql> -- 示例:取左边第一个单词
    mysql> SELECT SUBSTRING_INDEX(T.words,',',1) FROM word_table T ;
    +--------------------------------+
    | SUBSTRING_INDEX(T.words,',',1) |
    +--------------------------------+
    | apple                          |
    | computer                       |
    | laddy                          |
    +--------------------------------+
    3 rows in set (0.00 sec)mysql> -- 示例:取左边二个单词
    mysql> SELECT SUBSTRING_INDEX(T.words,',',2) FROM word_table T ;
    +--------------------------------+
    | SUBSTRING_INDEX(T.words,',',2) |
    +--------------------------------+
    | apple,orange                   |
    | computer,apple                 |
    | laddy,man                      |
    +--------------------------------+
    3 rows in set (0.00 sec)mysql> -- 示例:取右边一个单词,由此可以把每一个单词都拿出来
    mysql> SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(T.words,',',1),',',-1) FROM word_table T ;
    +--------------------------------------------------------+
    | SUBSTRING_INDEX(SUBSTRING_INDEX(T.words,',',1),',',-1) |
    +--------------------------------------------------------+
    | apple                                                  |
    | computer                                               |
    | laddy                                                  |
    +--------------------------------------------------------+
    3 rows in set (0.00 sec)mysql> SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(T.words,',',2),',',-1) FROM word_table T ;
    +--------------------------------------------------------+
    | SUBSTRING_INDEX(SUBSTRING_INDEX(T.words,',',2),',',-1) |
    +--------------------------------------------------------+
    | orange                                                 |
    | apple                                                  |
    | man                                                    |
    +--------------------------------------------------------+
    3 rows in set (0.00 sec)
    

基本实现思路

  1. 计算单词组字符串中的分隔符个数从而得出单词个数(分隔符个数+1)。

    	-- 计算单词个数,即分隔符的个数+1,便为单词个数-- LENGTH:计算字符串中的字符个数-- REPLACE: 分换字符串中的字符,这里是将分隔符删除SELECT words,(LENGTH(T.words) - LENGTH(REPLACE(T.words, ',',''))+1) AS wordsCount FROM word_table T
    
    +--------------------+------------+
    | words              | wordsCount |
    +--------------------+------------+
    | apple,orange,lemon |          3 |
    | computer,apple     |          2 |
    | laddy,man,woman    |          3 |
    +--------------------+------------+
    3 rows in set (0.00 sec)
    
  2. 根据单词个数显示查询行数。

    	-- 借助mysql.help_topic表中的help_topic_id 进行关联,进行拆分第一步-- help_topic_id 从0开始,固定数量的(和数据库版本有关),我这里为0~699-- 示例:help_topic_id < 2,则符合条件的有0,1SELECT T.words FROM word_table T INNER JOIN mysql.help_topic H ON H.help_topic_id < (LENGTH(T.words) - LENGTH(REPLACE(T.words, ',',''))+1)
    
    +--------------------+
    | words              |
    +--------------------+
    | apple,orange,lemon |
    | apple,orange,lemon |
    | apple,orange,lemon |
    | computer,apple     |
    | computer,apple     |
    | laddy,man,woman    |
    | laddy,man,woman    |
    | laddy,man,woman    |
    +--------------------+
    8 rows in set (0.00 sec)
    
  3. 在该组的每一行,根据顺序依次切割出单词。

    第一次切割出一个,第二次切割出两个,第三次切割出三个。

    	-- 通过 mysql.help_topic 的help_topic_id 序列ID来顺序分割SELECT SUBSTRING_INDEX(T.words,',',H.help_topic_id+1) FROM word_table T INNER JOIN mysql.help_topic HON H.help_topic_id < (LENGTH(T.words)-LENGTH(REPLACE(T.words,',',''))+1)
    
    +------------------------------------------------+
    | SUBSTRING_INDEX(T.words,',',H.help_topic_id+1) |
    +------------------------------------------------+
    | apple                                          |
    | apple,orange                                   |
    | apple,orange,lemon                             |
    | computer                                       |
    | computer,apple                                 |
    | laddy                                          |
    | laddy,man                                      |
    | laddy,man,woman                                |
    +------------------------------------------------+
    8 rows in set (0.00 sec)
    
  4. 每行拿右边第一个单词即可。

    	-- 完整拆分操作SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(T.words,',',H.help_topic_id+1),',',-1) FROM word_table T INNER JOIN mysql.help_topic HON H.help_topic_id < (LENGTH(T.words)-LENGTH(REPLACE(T.words,',',''))+1)
    
    +------------------------------------------------------------------------+
    | SUBSTRING_INDEX(SUBSTRING_INDEX(T.words,',',H.help_topic_id+1),',',-1) |
    +------------------------------------------------------------------------+
    | apple                                                                  |
    | orange                                                                 |
    | lemon                                                                  |
    | computer                                                               |
    | apple                                                                  |
    | laddy                                                                  |
    | man                                                                    |
    | woman                                                                  |
    +------------------------------------------------------------------------+
    8 rows in set (0.00 sec)
    

    参考博文

    https://www.jb51.net/database/305918jub.htm

    https://blog.csdn.net/qq_23845083/article/details/135410361

    https://www.lidihuo.com/mysql/mysql-string-substring_index-function.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/15762.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中创建不可变对象实现细节和例子

当我们在Java中创建不可变对象时&#xff0c;我们需要确保对象的状态在创建之后不能被修改。以下是一些具体的实现细节和例子&#xff0c;展示了如何在Java中创建不可变对象。 实现细节 使用final关键字&#xff1a; 类定义前使用final关键字&#xff0c;表示该类不能被继承&…

Mysql中的慢查询

Mysql慢查询的一些sql命令 慢查询的默认事件为10秒 #注意&#xff1a;慢查询一般是在调试阶段开启的&#xff0c;在开发阶段中一般不会开启&#xff0c;会对效率产生延误 #查询慢查询是否开启 show variables like %general%; #慢查询时间设置 show variables like long_query…

【运维项目经历|018】:Elasticsearch智能数据分析平台项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 问题1&#xff1a;本次项目周期&#xff1f; 问题2&#xff1a;服务部署架构方式及数量和配置&…

【简明指南:Python中的异常处理与稳健代码设计】

文章目录 前言异常处理基础捕获多种异常确保资源被释放使用else子句自定义异常结论 前言 软件开发过程中&#xff0c;保证代码的稳健性和可靠性至关重要。异常处理是实现这一目标的关键技术之一。在Python编程中&#xff0c;合理地捕获和处理异常不仅能提高程序的健壮性&#…

查找专利渠道

官方渠道 常规检索 (cnipa.gov.cn)https://pss-system.cponline.cnipa.gov.cn/conventionalSearch 佰腾网 佰腾网 - 查专利就上佰腾网_佰腾全球专利搜索平台_商标查询平台_企业工商信息查询平台 (baiten.cn)https://www.baiten.cn/

NLP(19)--大模型发展(3)

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 大模型训练相关知识&#xff1a; 问题&#xff1a; 数据集过大&#xff0c;快速训练模型过大&#xff0c;gpu跑不完 方案&#xff1a; 数据并行训练&#xff1a; 复制数据&#xff08;batch_size&#xff09;到多个gpu&…

簡述vue-router的動態路由

动态路由 addRoute 是 Vue Router 中的一个功能&#xff0c;它允许你在运行时动态地向路由表添加路由规则。这在一些需要基于用户行为或异步数据加载路由的场景中非常有用。以下是对 addRoute 功能的详细解释和使用示例&#xff1a; 1. 动态路由的概念 动态路由是指在应用运行…

[杂项]优化AMD显卡对DX9游戏(天谕)的支持

目录 关键词平台说明背景RDNA 1、2、3 架构的显卡支持游戏一、 优化方法1.1 下载 二、 举个栗子&#xff08;以《天谕》为例&#xff09;2.1 下载微星 afterburner 软件 查看游戏内信息&#xff08;可跳过&#xff09;2.2 查看D3D9 帧数2.3 关闭游戏&#xff0c;替换 dll 文件2…

精品PPT | MES设计与实践,业务+架构+实施(免费下载))

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 MES设计与实践 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT/WORD原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方案&#x…

linux的chmod的数字太难记了,用u, g, o, a更简单!

u, g, o, 和 a是用来设置或查看文件或目录权限在类Unix或Linux系统中的特殊字符&#xff0c;它们分别代表文件或目录的所有者(user)、所属组(group)、其他用户(others)和所有用户(all users)。 而权限方r和w是其中的两种&#xff0c;分别代表读权限&#xff08;read&#xff0…

【探索数据结构】线性表之单链表

&#x1f389;&#x1f389;&#x1f389;欢迎莅临我的博客空间&#xff0c;我是池央&#xff0c;一个对C和数据结构怀有无限热忱的探索者。&#x1f64c; &#x1f338;&#x1f338;&#x1f338;这里是我分享C/C编程、数据结构应用的乐园✨ &#x1f388;&#x1f388;&…

Autodl服务器中Faster-rcnn(jwyang)复现(一)

前言 在做实验时需要用到faster-rcnn做对比,本节首先完成代码复现,用的数据集是VOC2007~ 项目地址:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 复现环境:autodl服务器+python3.6+cuda11.3+Ubuntu20.04+Pytorch1.10.0 目录 一、环境配置二、编译cud…

2024年软考总结 信息系统管理师

选择题 英文题&#xff0c;我是一题也没把握&#xff0c;虽然我理解意思。 千万不要认为考死记硬背不对。目的不在于这。工程项目中有很多重要的数字&#xff0c;能记住说明你合格。 案例 几乎把答案全写在案例中了。 计算题 今年最简单。没有考成本。 只考了关键路径&a…

头歌OpenGauss数据库-I.复杂查询第8关:两门及以上课程不及格的学生

任务描述 本关任务:根据提供的表和数据,查询两门及其以上不及格课程的同学的学号(s_id)、姓名(s_name)及其平均成绩(avg_score),要求计算平均成绩后为整数。 student表数据: s_ids_names_sex01Mia女02Riley男03Aria女04Lucas女05Oliver男06Caden男07Lily女08Jacob男c…

安卓开发:相机水印设置

1.更新水印 DecimalFormat DF new DecimalFormat("#"); DecimalFormat DF1 new DecimalFormat("#.#");LocationManager LM (LocationManager)getSystemService(Context.LOCATION_SERVICE); LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2…

【学习笔记】计算机组成原理(七)

指令系统 文章目录 指令系统7.1 机器指令7.1.1 指令的一般格式7.1.2 指令字长 7.2 操作数类型和操作类型7.2.1 操作数类型7.2.2 数据在存储器中的存放方式7.2.3 操作类型 7.3 寻址方式7.3.1 指令寻址7.3.1.1 顺序寻址7.3.1.2 跳跃寻址 7.3.2 数据寻址7.3.2.1 立即寻址7.3.2.2 直…

第四十五天 | 322.零钱兑换

题目&#xff1a;322.零钱兑换 尝试解答&#xff1a; 1.确定dp[j]含义&#xff1a;装满容量为j的背包所需要放的硬币个数为dp[j]; 2.动态转移方程&#xff1a;dp[j] dp[j - coins[i]] 1; 3.遍历顺序&#xff1a;本题应该为组合类题目&#xff0c;不考虑装入的顺序&#x…

精品PPT | 精益生产管理中MES系统的实现与应用(免费下载)

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 MES系统的实现与应用 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT/WORD原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方案&…

吃掉 N 个橘子的最少天数(Lc1553)——记忆化搜索

厨房里总共有 n 个橘子&#xff0c;你决定每一天选择如下方式之一吃这些橘子&#xff1a; 吃掉一个橘子。如果剩余橘子数 n 能被 2 整除&#xff0c;那么你可以吃掉 n/2 个橘子。如果剩余橘子数 n 能被 3 整除&#xff0c;那么你可以吃掉 2*(n/3) 个橘子。 每天你只能从以上 …

Redis - 缓存场景

学习资料 学习的黑马程序员哔站项目黑马点评&#xff0c;用作记录和探究原理。 Redis缓存 缓存 &#xff1a;就是数据交换的缓冲区&#xff0c;是存储数据的临时地方&#xff0c;读写性能较高 缓存常见的场景: 数据库查询加速&#xff1a;通过将频繁查询的数据缓存起来&…