Dict.CN 在线词典, 英语学习, 在线翻译

都市淘沙者

荔枝FM Everyone can be host

统计

留言簿(23)

积分与排名

优秀学习网站

友情连接

阅读排行榜

评论排行榜

Mysql 实现split字符串分割


--场景大致如下:有A B两表,A表中的某一字段bids存放着一个B表主键的数组如3,4,5 而这个时候要做关联查询的时候,理想情况应该可以这样做
select b.* from A a,B b where b.id in (a.bids.split(',')) 但是mysql并不支持这样做,也没有提供类似的做法,所以很糟糕。 有一种变态的做法就是给bids做一下处理,就是
在bids的前后都加上逗号, 这样bids就变成,3,4,5, 这个时候利用模糊查询来做关联就可以达到目的了,做法如下:
select b.* from A a, B b where CONCAT(CONCAT(',',a.bids),','LIKE CONCAT(CONCAT('%,',b.id),',%'

当b的id
=3时候的查询相当于执行
select b.* from A a, B b where  ',3,4,5,' LIKE  '%,3,%'

----真实例子----
SELECT t.*
FROM tea_material_trade t ,tea_process_product p WHERE p.id =2 AND  CONCAT(CONCAT(',',p.tradeids),','LIKE CONCAT(CONCAT('%,',t.id),',%'


--值得注意的是,这样的效率恐怕比较低,小数据量应该没有问题,大数据量估计不能这么做



mysql像个蛋一样,连基本的函数都不提供,难怪被oracle买了。只有通过存储过程来搞,郁闷得不行。

DELIMITER $$

USE `teasys`$$

DROP PROCEDURE IF EXISTS `proc_split`$$

CREATE DEFINER=`root`@`localhost` PROCEDURE `proc_split`(
    inputstring 
VARCHAR(1000),
    delim 
CHAR(1)
)
BEGIN
    
DECLARE strlen INT;
    
DECLARE last_index INT;
    
DECLARE cur_index INT;
    
DECLARE cur_char VARCHAR(200);
    
DECLARE len INT;
    
SET cur_index=1;
    
SET last_index=0;
    
SET strlen=LENGTH(inputstring);  
    
DROP TABLE IF EXISTS splittable;
    
CREATE TEMPORARY TABLE splittable(
        id 
INT AUTO_INCREMENT,
        VALUE 
VARCHAR(20),
        
PRIMARY KEY (`ID`),
        
UNIQUE KEY `ID` (`ID`)
    ) ;
    
WHILE(cur_index<=strlen) DO    
    
BEGIN
        
IF SUBSTRING(inputstring FROM cur_index FOR 1)=delim OR cur_index=strlen THEN
            
SET len=cur_index-last_index-1;
            
IF cur_index=strlen THEN
               
SET len=len+1;
            
END IF;
            
INSERT INTO splittable(`value`)VALUES(SUBSTRING(inputstring FROM (last_index+1FOR len));
            
SET last_index=cur_index;
        
END IF;
        
SET cur_index=cur_index+1;
    
END;
    
END WHILE;
END$$

DELIMITER ;


CALL proc_split(
'a,b,c',',');
SELECT * FROM splittable

posted on 2011-02-26 21:28 都市淘沙者 阅读(9509) 评论(0)  编辑  收藏 所属分类: Oracle/Mysql/Postgres/


只有注册用户登录后才能发表评论。


网站导航: