zoukankan      html  css  js  c++  java
  • mysql动态sql 整理多个字段

    原始表:

    整理后的表:

    方案一(动态sql):

    BEGIN
        #Routine body goes here...
        DECLARE v1 int(3);
        DECLARE v2 int(3);
        #DECLARE v3 VARCHAR(15);
        
    
        #DECLARE vcompany VARCHAR(30);
        #DECLARE vname VARCHAR(30);
    
        DECLARE vcol VARCHAR(30);
        DECLARE tmp_sql VARCHAR(3000);
        DECLARE vid int(3);
    
    
        set v1 = 1;
        WHILE v1 <= 11993 DO
            set v2=2;
            #if v2 <=27 THEN 
            WHILE v2 <=27  DO
    
                set @v3=CONCAT('l',v2);
                set @vcompany='';
                set @vname='';
                #set @vid='';
                
                SET @l_sql=CONCAT_ws(' ',
                    'select company_name,',@v3,
                    'into @vcompany,@vname',
                    'from for_xun_cha where id =',v1);
                SET @sql=@l_sql;
                prepare stmt from @sql;
                execute stmt;
    
                    #select company_name,l2 into vcompany,vname from for_xun_cha where id=v2;
                if LENGTH(trim(@vname)) > 0 THEN
                    INSERT into tmp(company,name) VALUES(@vcompany,@vname);
                    #INSERT into tmp(company,name) VALUES(vcompany,tmp_sql);
                end if; 
                set v2 = v2+1;
            #end if;
            end WHILE;
            set v1 = v1 + 1;
        END WHILE;
    
        
    END

    方案二(先合并各列,再用游标处理):

    BEGIN
    DECLARE Done INT DEFAULT 0;
    DECLARE n int ; -- 最大列 27
    DECLARE companyName VARCHAR(20) ;-- 公司名称
    DECLARE personNames VARCHAR(1000);-- 员工名称
    DECLARE personName VARCHAR(10);
    
    DECLARE _cur CURSOR FOR select company_name ,CONCAT_WS(",",l2,l3,l4,l5,l6,l7,l8,l9,l10,l11,l12,l13,l14,l15,l16,l17,l18,l19,l20,l21,l22,l23,l24,l25,l26,l27) from for_xun_cha;
    
    OPEN _cur;
        FETCH _cur INTO companyName,personNames;
        REPEAT
        IF NOT Done THEN
             test:    WHILE(n<=27) DO
                set personName=SUBSTRING_INDEX(SUBSTRING_INDEX(personNames,',',n),',',-1);
                    if  ISNULL(personName) || LENGTH(trim(personName))<1 THEN
                            LEAVE test;
                    ELSE
                        INSERT INTO temp1 VALUES (companyName,personName);
                    END IF;
                set n=n+1;
                end while;
        end IF;
    set n = 1;
        FETCH NEXT FROM _cur INTO companyName,personNames;
        UNTIL Done END REPEAT;
    
    -- set personName="";
    -- set personNames="";
    CLOSE _cur;
    END
  • 相关阅读:
    设计模式一 Simple Factory, Factory Method, Abstract Factory以及Builder模式简述
    SQL Server中对XML操作
    开发常用小工具介绍
    强制休息程序 EyeGuardian 眼睛守护者 Beta测试版
    定时计划任务方案比较以及通过脚本创建计划任务(SchTasks命令)
    在Myeclipse中配置Maven
    Jena的环境配置
    0x01_go代码简单示例
    0x00_go语言安装
    信息收集工具
  • 原文地址:https://www.cnblogs.com/vijayfly/p/6031414.html
Copyright © 2011-2022 走看看