Dict.CN 在線詞典, 英語學(xué)習(xí), 在線翻譯

          都市淘沙者

          荔枝FM Everyone can be host

          導(dǎo)航

          <2025年6月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          293012345

          公告


          我的blog中的部分資源是來自于網(wǎng)絡(luò)上,如果你認(rèn)為侵犯了你的權(quán)利,請(qǐng)及時(shí)聯(lián)系jelver#163.com,我會(huì)盡快刪除!另外如果要留言最好通過郵件的形式跟我交流因?yàn)槲也皇呛芙?jīng)常寫文章,前面有的朋友留言好久了我才發(fā)現(xiàn),所以對(duì)不住大家,現(xiàn)在留下MSN:jelver#163.com和QQ:253840881,歡迎交流! (用@代替#)

          隨筆分類

          文章分類

          隨筆檔案

          文章檔案

          相冊(cè)

          統(tǒng)計(jì)

          留言簿(23)

          積分與排名

          優(yōu)秀學(xué)習(xí)網(wǎng)站

          友情連接

          閱讀排行榜

          評(píng)論排行榜

          Mysql 實(shí)現(xiàn)split字符串分割


          --場景大致如下:有A B兩表,A表中的某一字段bids存放著一個(gè)B表主鍵的數(shù)組如3,4,5 而這個(gè)時(shí)候要做關(guān)聯(lián)查詢的時(shí)候,理想情況應(yīng)該可以這樣做
          select b.* from A a,B b where b.id in (a.bids.split(',')) 但是mysql并不支持這樣做,也沒有提供類似的做法,所以很糟糕。 有一種變態(tài)的做法就是給bids做一下處理,就是
          在bids的前后都加上逗號(hào), 這樣bids就變成,3,4,5, 這個(gè)時(shí)候利用模糊查詢來做關(guān)聯(lián)就可以達(dá)到目的了,做法如下:
          select b.* from A a, B b where CONCAT(CONCAT(',',a.bids),','LIKE CONCAT(CONCAT('%,',b.id),',%'

          當(dāng)b的id
          =3時(shí)候的查詢相當(dāng)于執(zhí)行
          select b.* from A a, B b where  ',3,4,5,' LIKE  '%,3,%'

          ----真實(shí)例子----
          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),',%'


          --值得注意的是,這樣的效率恐怕比較低,小數(shù)據(jù)量應(yīng)該沒有問題,大數(shù)據(jù)量估計(jì)不能這么做



          mysql像個(gè)蛋一樣,連基本的函數(shù)都不提供,難怪被oracle買了。只有通過存儲(chǔ)過程來搞,郁悶得不行。

          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) 評(píng)論(0)  編輯  收藏 所屬分類: Oracle/Mysql/Postgres/

          主站蜘蛛池模板: 潮州市| 惠来县| 玉环县| 卫辉市| 阳春市| 屏边| 柳州市| 抚松县| 平武县| 林甸县| 沐川县| 屏山县| 女性| 兴城市| 临江市| 柘荣县| 汾西县| 科技| 潼关县| 株洲县| 佛教| 太白县| 政和县| 平定县| 永福县| 忻州市| 韩城市| 张家口市| 阜康市| 星子县| 轮台县| 嵊州市| 梓潼县| 加查县| 克什克腾旗| 宁津县| 慈利县| 凭祥市| 广元市| 通许县| 武胜县|