• 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
  • 相关阅读:
    git 常用命令
    重要知识点
    HTML 标记语言
    js类型转换
    伪数组变数组 js
    在 JavaScript 中为什么 typeof null 的结果是 object?
    HTML中href、src区别
    解决for循环插入同一元素无法重复插入问题
    HTML5-语义化
    mount 和 /etc/fstab关系。
  • 原文地址:https://www.cnblogs.com/vijayfly/p/6031414.html
Copyright © 2020-2023  润新知