Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4154427
  • 博文数量: 240
  • 博客积分: 11504
  • 博客等级: 上将
  • 技术积分: 4277
  • 用 户 组: 普通用户
  • 注册时间: 2006-12-28 14:24
文章分类

全部博文(240)

分类: Mysql/postgreSQL

2014-01-08 12:55:02

 实现分割字符串。
MYSQL版本。 由于MYSQL不支持递归,不支持返回表类型的结果,所以代码比较繁琐。 我用了两个函数以及一个存储过程来实现。


-- 得到分割符的总数。

点击(此处)折叠或打开

  1. DELIMITER $$


  2. CREATE DEFINER=`root`@`%` FUNCTION `func_get_split_string_total`(
  3. f_string VARCHAR(1000),f_delimiter VARCHAR(5)
  4. ) RETURNS INT(11)
  5. BEGIN
  6.   -- Get the total number of given string.
  7.   RETURN 1+(LENGTH(f_string) - LENGTH(REPLACE(f_string,f_delimiter,'')));
  8. END$$


  9. DELIMITER ;



-- 得到具体下表的子字符。

点击(此处)折叠或打开

  1. DELIMITER $$




  2. CREATE DEFINER=`root`@`%` FUNCTION `func_get_split_string`(
  3. f_string VARCHAR(1000),f_delimiter VARCHAR(5),f_order INT) RETURNS VARCHAR(255) CHARSET utf8
  4. BEGIN
  5.   -- Get the separated number of given string.
  6.   DECLARE result VARCHAR(255) DEFAULT '';
  7.   SET result = REVERSE(SUBSTRING_INDEX(REVERSE(SUBSTRING_INDEX(f_string,f_delimiter,f_order)),f_delimiter,1));
  8.   RETURN result;
  9. END$$


  10. DELIMITER ;




-- 打印结果。 用临时表来实现。

点击(此处)折叠或打开

  1. DELIMITER $$


  2. CREATE PROCEDURE `sp_print_result`(
  3.  IN f_string VARCHAR(1000),IN f_delimiter VARCHAR(5)
  4. )
  5. BEGIN
  6.   -- Get the separated string.
  7.   DECLARE cnt INT DEFAULT 0;
  8.   DECLARE i INT DEFAULT 0;
  9.   SET cnt = func_get_split_string_total(f_string,f_delimiter);
  10.   DROP TABLE IF EXISTS tmp_print;
  11.   CREATE TEMPORARY TABLE tmp_print (v_text varchar(200) NOT NULL);
  12.   WHILE i < cnt
  13.   DO
  14.     SET i = i + 1;
  15.     INSERT INTO tmp_print(v_text) VALUES (func_get_split_string(f_string,f_delimiter,i));
  16.   END WHILE;
  17.   SELECT * FROM tmp_print;
  18.   
  19. END$$


  20. DELIMITER ;




我们来执行:

点击(此处)折叠或打开

  1. CALL sp_print_result('love,you,hate,number',',');
  2. query result
  3. v_text
  4. love
  5. you
  6. hate
  7. number



PostgreSQL比较灵活, 有以下几种方法来实现。
 第一种,普通的分析字符串方法。
 

点击(此处)折叠或打开

  1. create or replace function split_to_string(
  2. IN f_string text,
  3. IN f_delimiter varchar(10)
  4. ) returns setof text as
  5. $ytt$
  6.   declare cnt int;
  7.   declare i int;
  8.   declare v_result text;
  9.   begin
  10.       i := 1;
  11.       cnt := length(f_string) - length(replace(f_string,f_delimiter,''))+1;
  12.       while i <= cnt
  13.       loop
  14.         v_result := split_part(f_string,f_delimiter,i);
  15. return next v_result;
  16.         i := i + 1;
  17.       end loop;


  18.   end;
  19. $ytt$ language plpgsql;



结果:

点击(此处)折叠或打开

  1. t_girl=# select split_to_string('love,you,hate,number',',') as result;
  2.  result
  3. --------
  4.  love
  5.  you
  6.  hate
  7.  number
  8. (4 rows)




第二种, 用自己带的正则函数来实现。

点击(此处)折叠或打开

  1. t_girl=# SELECT ytt FROM regexp_split_to_table('love,you,hate,number', E',+') AS ytt;
  2.   ytt
  3. --------
  4.  love
  5.  you
  6.  hate
  7.  number
  8. (4 rows)


  9. t_girl=#




第三种,用自带的WITH 语法来实现。



点击(此处)折叠或打开

  1. t_girl=# with recursive ytt(f1,f2) as (
  2. values (0,' '::text)
  3. union all
  4. select f1+1,split_part('love,you,hate,number',',',f1+1) from ytt where f1 < 20
  5. )
  6. select f2 as result from ytt where f1 >=1 and f1 <= length('love,you,hate,number')-length(replace('love,you,hate,number',',',''))+1;
  7.  result
  8. --------
  9.  love
  10.  you
  11.  hate
  12.  number
  13. (4 rows)


  14. Time: 0.725 ms
  15. t_girl=#


阅读(7262) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~