mysql字符串分割功能实现

 更新时间:2023年02月15日 10:24:09   作者:左叔  
这篇文章主要介绍了mysql字符串分割功能实现,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

mysql字符串分割

1、字符串分割函数

drop function if exists str_for_substr;
CREATE
    DEFINER = `root`@`%` FUNCTION `str_for_substr`(`num` int, `str` varchar(5000))
    RETURNS varchar(100) no sql
BEGIN
    /*函数功能: 把带逗号的字符串分割取出
        参数: num 要取出的字符串的索引值, 以0开始
                    str 以逗号分割的字符串
        扩展: 将###替换成其他符合,即可完成不同分隔符拆分字符串,亦可以把分隔符作为参数
  */
    SET @str_for_substr =
            SUBSTRING(
                    SUBSTRING_INDEX(str, '###', num + 1),
                    CASE num
                        WHEN 0 THEN
                                CHAR_LENGTH(
                                        SUBSTRING_INDEX(str, '###', num)
                                    ) + 1
                        ELSE
                                CHAR_LENGTH(
                                        SUBSTRING_INDEX(str, '###', num)
                                    ) + 4
                        END,
                    CASE num
                        WHEN 0 THEN
                                CHAR_LENGTH(
                                        SUBSTRING_INDEX(str, '###', num + 1)
                                    ) - CHAR_LENGTH(
                                        SUBSTRING_INDEX(str, '###', num)
                                    )
                        ELSE
                                CHAR_LENGTH(
                                        SUBSTRING_INDEX(str, '###', num + 1)
                                    ) - CHAR_LENGTH(
                                        SUBSTRING_INDEX(str, '###', num)
                                    ) - 1
                        END
                );
    RETURN @str_for_substr;
END;

2、创建存储过程,循环插入截取的每一条数据

drop procedure if exists split_str;
CREATE
    DEFINER = `root`@`%` PROCEDURE `split_str`()

BEGIN

    DECLARE cnt int default 0;
    DECLARE num int default 0;
    DECLARE i int default 0;
    DECLARE j int default 0;
    declare str varchar(4000);

#   统计当前截取字段表的数据量
    select count(1) into cnt from test;
#   循环查询每一条数据,此处可以换成游标处理
    while i<= cnt do
        select query_knowledge_list_string into str from test limit i,1;
#       查询每条数据###出现的次数
        SET num = (LENGTH(str) - LENGTH(REPLACE(str, '###', ''))) / 3;
        while j <= num do
#               循环插入截取后的数据
                INSERT INTO test1 (knowledge_name, subject_name, grade_name)
                select str_for_substr(j,str), subjectName, grade_name
                from test limit i,1;
            set j = j + 1;
            end while;
#       循环值归零
        set j = 0;
        set i = i + 1;
        end while;
END;

扩展:mysql字段的分割截取功能(模拟split)

大家好,又见面了。每次见面就说明我又解决了一个疑难杂症。今天这个问题更狠一些,又让我的sql能力有了进一步的提高。简单说我我最近为什么会有这么多的sql问题,主要原因就是我们从数据中台的hive库同步数据,而他们库里的数据实在是脏的过分,有各种你想象不到数据,而我们也推不动不了他们,没把办法就只能通过sql自己处理。

接下来看看今天的奇葩问题。我们同步过来的数据内容如下。

image.png

最可怕就是在类型的前面多了一些数字加顿号。这些内容对于我来讲是完全没有意义的,我需要的只是顿号后面的内容。那么我应该怎么处理得到后面的内容呢。最先想到的是split. 但是后来查了一下,mysql居然不支持split函数。真是让我大失所望。后来只能去找相近的函数,发现有一个INSTR() 函数,可以用来判断时段中是否包含某个字符串 ,并返回包含字符串对应的索引。在结合SUBSTR函数进行截取,就可以完美解决这个问题了。

同时还要注意,最好做下判断,只有当字段中包含这个字符串时才进行截取,不包含则不截取。最终得到的sql如下:

select 
year,
case when INSTR(subtype,'、')>0 then SUBSTR(subtype,INSTR(subtype,'、')+1)
else subtype END subtype
from 
xxx_table_name

最终得到结果成功。

image.png

到此这篇关于mysql字符串分割的文章就介绍到这了,更多相关mysql字符串分割内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL中处理各种重复的一些方法

    MySQL中处理各种重复的一些方法

    这篇文章主要介绍了MySQL中处理各种重复的一些方法,包括对表和查询结果的重复的一些处理,需要的朋友可以参考下
    2015-05-05
  • 关于Mysql插入中文字符报错ERROR 1366(HY000)的解决方法

    关于Mysql插入中文字符报错ERROR 1366(HY000)的解决方法

    这篇文章主要介绍了关于Mysql插入中文字符报错ERROR 1366(HY000)的解决方法,在我们日常使用mysql的过程中会经常遇到各种报错,今天我们就来看一下ERROR 1366报错的解决方法吧
    2023-07-07
  • 用Autoconf检测MySQL软件包的教程

    用Autoconf检测MySQL软件包的教程

    这篇文章主要介绍了用Autoconf检测MySQL软件包的教程,主要使用编写好的ax_lib_mysql脚本进行操作,需要的朋友可以参考下
    2015-06-06
  • MySQL中日期比较时遇到的编码问题解决办法

    MySQL中日期比较时遇到的编码问题解决办法

    这篇文章主要介绍了MySQL中日期比较时遇到的字符集问题解决办法,本文遇到的问题是date_format函数和timediff函数之间比较时,编码问题导致出错,本文使用convert()函数解决了这个问题,需要的朋友可以参考下
    2014-07-07
  • MySQL筑基篇之增删改查操作详解

    MySQL筑基篇之增删改查操作详解

    这篇文章主要和大家讲解一下MySQL数据库的增删改查操作,这里的查询确切的说应该是初级的查询,不涉及函数、分组等模块,需要的可以参考一下
    2022-07-07
  • 安装的mysql中没有my.ini文件的解决方法

    安装的mysql中没有my.ini文件的解决方法

    本文主要介绍了安装的mysql中没有my.ini文件的解决方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Mysql事务处理详解

    Mysql事务处理详解

    什么是事务处理呢??事务处理是用来维护数据库的完整性的,它保证成批的MySQL操作要么完全执行,要么完成不执行。
    2017-08-08
  • MySQL查询出现1055错误的原因及解决方法

    MySQL查询出现1055错误的原因及解决方法

    Mysql在使用过程中经常遇到错误,都是本人在实际应用中处理检验过的,本文对常见错误出现的代码进行详细分析,下面这篇文章主要给大家介绍了关于MySQL查询出现1055错误的原因及解决方法,需要的朋友可以参考下
    2023-05-05
  • mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结

    mysql 数据同步 出现Slave_IO_Running:No问题的解决方法小结

    mysql replication 中slave机器上有两个关键的进程,死一个都不行,一个是slave_sql_running,一个是Slave_IO_Running,一个负责与主机的io通信,一个负责自己的slave mysql进程。
    2011-05-05
  • MySQL中的ibdata1用法解读

    MySQL中的ibdata1用法解读

    这篇文章主要介绍了MySQL中的ibdata1用法解读,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03

最新评论