设为首页收藏本站

就爱编程论坛

 找回密码
 注册

人人连接登陆

无需注册,直接登录

用新浪微博连接

一步搞定

QQ登录

只需一步,快速开始

查看: 487|回复: 0
打印 上一主题 下一主题

MySQL中利用存储过程分割字符串的方法 [复制链接]

Rank: 9Rank: 9Rank: 9

  • TA的每日心情
    无聊
    2025-5-27 03:37:20
  • 签到天数: 366 天

    [LV.9]以坛为家II

    论坛先锋 学习至圣 荣誉成员 论坛元老 活跃之星 终极领袖

    我玩的应用:

    跳转到指定楼层
    楼主
    发表于 2012-5-25 17:20:26 |只看该作者 |倒序浏览
    现有一段字符串,如apple,banana,orange,pears,grape,要把它按照逗号(,)分割成:
    apple
    banana
    orange
    pears
    grape
    然后使用where in()方法可以查询。
    1、具体函数:
    • # 函数:func_split_TotalLength
    • DELIMITER $$
    • DROP
      function IF EXISTS `func_split_TotalLength` $$
    • CREATE DEFINER=`root`@`%` FUNCTION `func_split_TotalLength`
    • (f_string varchar(1000),f_delimiter varchar(5)) RETURNS
      int(11)
    • BEGIN
    •     # 计算传入字符串的总length
    •     return 1+(length(f_string) - length(replace(f_string,f_delimiter,'')));
    • END$$
    • DELIMITER;
    • # 函数:func_split
    • DELIMITER $$
    • DROP
      function IF EXISTS `func_split` $$
    • CREATE DEFINER=`root`@`%` FUNCTION `func_split`
    • (f_string varchar(1000),f_delimiter varchar(5),f_order int) RETURNS
      varchar(255) CHARSET utf8
    • BEGIN
    •     # 拆分传入的字符串,返回拆分后的新字符串
    •         declare result varchar(255) default
      '';
    •         set result = reverse(substring_index(reverse(substring_index(f_string,f_delimiter,f_order)),f_delimiter,1));
    •         return result;
    • END$$
    • DELIMITER;
    • # 存储过程:splitString
    • DELIMITER $$
    • DROP
      PROCEDURE IF EXISTS `splitString` $$
    • CREATE
      PROCEDURE `splitString`
    • (IN f_string varchar(1000),IN f_delimiter varchar(5))
    • BEGIN
    • # 拆分结果
    • declare cnt int
      default 0;
    • declare i int
      default 0;
    • set cnt = func_split_TotalLength(f_string,f_delimiter);
    • DROP
      TABLE IF EXISTS `tmp_split`;
    • create
      temporary
      table `tmp_split` (`status` varchar(128) not
      null) DEFAULT CHARSET=utf8;
    • while i < cnt
    • do
    •     set i = i + 1;
    •     insert
      into tmp_split(`status`) values (func_split(f_string,f_delimiter,i));
    • end while;
    • END$$
    • DELIMITER;
    2、测试是否能成功分割
    • call splitString("apple,banana,orange,pears,grape",",");
    • select * from tmp_split;
    运行结果如下,说明分割成功:
    mysql> call splitString("apple,banana,orange,pears,grape",",");
    select * from tmp_split;
    Query OK, 1 row affected

    +--------+
    | status |
    +--------+
    | apple  |
    | banana |
    | orange |
    | pears  |
    | grape  |
    +--------+
    5 rows in set

    mysql>
    3、应用where in()查询
    • # 先传入字符串,分割后保存在临时表tmp_split中
    • call splitString("apple,banana,orange,pears,grape",",");
    • # 将查询的结果作为其他查询的条件来使用
    • select * from fruit where
      in(select * from tmp_split);
    分享到: QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    分享分享0 收藏收藏0 支持支持0 反对反对0 分享到人人 转发到微博
    [img=http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=fRUcHhYWGAQ9GxIFEBwUEVMeEhA]http://rescdn.qqmail.com/zh_CN/htmledition/images/function/qm_open/ico_mailme_02.png[/img]

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册 人人连接登陆

    晴云孤魂's Blog|就爱编程搜帖|手机版|Archiver|就爱编程论坛     

    GMT+8, 2025-7-2 03:07 , Processed in 0.090462 second(s), 26 queries .

    Powered by Discuz! X2

    © 2001-2011 Comsenz Inc.

    回顶部