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 都市淘沙者 閱讀(9533) 評論(0)  編輯  收藏 所屬分類: Oracle/Mysql/Postgres/

          主站蜘蛛池模板: 崇州市| 竹山县| 伊春市| 博爱县| 柳河县| 抚宁县| 屏山县| 铁力市| 黄陵县| 海南省| 湘西| 石棉县| 壶关县| 枣强县| 安徽省| 南平市| 靖西县| 于都县| 双牌县| 鹤庆县| 灌阳县| 崇州市| 景洪市| 桂东县| 高唐县| 岳西县| 延吉市| 东兴市| 平山县| 鸡东县| 内黄县| 谢通门县| 裕民县| 衡阳县| 灯塔市| 巴东县| 永清县| 招远市| 南川市| 阳高县| 泗洪县|