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
时间: 2024-10-05 13:06:56

mysql动态sql 整理多个字段的相关文章

MySQL 动态sql语句执行 用时间做表名

1. 描述 在使用数据的时候,我时候我们需要很多数据库,而且想用时间来做表名以区分.但是MySQL在存储过程中不支持使用变量名来做表名或者列名. 比如,有一个表我们想以"2015-07-16 12:00:00"命名. 2. 解决方案 如果只是更换一个普通的表名的话,很简单,直接使用下面sql语句即可: alter table old_table_name rename new_table_name 但是要以时间为表名,动态命名的话就不可以了.首先我们可以用NOW()函数获取系统当前的时

MySQL 动态sql语句运行 用时间做表名

1. 描写叙述 在使用数据的时候,我时候我们须要非常多数据库,并且想用时间来做表名以区分.可是MySQL在存储过程中不支持使用变量名来做表名或者列名. 比方,有一个表我们想以"2015-07-16 12:00:00"命名. 2. 解决方式 假设仅仅是更换一个普通的表名的话,非常easy.直接使用以下sql语句就可以: alter table old_table_name rename new_table_name 可是要以时间为表名,动态命名的话就不能够了.首先我们能够用NOW()函数

Mysql中用SQL增加、删除字段,修改字段名、字段类型、注释,调整字段顺序总结

在网站重构中,通常会进行数据结构的修改,所以添加,删除,增加mysql表的字段是难免的,有时为了方便,还会增加修改表或字段的注释,把同字段属性调整到一块儿.这些操作可以在phpmyadmin或者别的mysql管理工具中完成,但是我们有时为了更方便的管理,会选择写sql语句来实现. 1.增加一个字段  代码如下 复制代码 //增加一个字段,默认为空alter table user add COLUMN new1 VARCHAR(20) DEFAULT NULL; //增加一个字段,默认不能为空al

mysql下sql语句令某字段值等于原值加上一个字符串

MYSQL在一个字段值后面加字符串,如下: member 表名 card 字段名 update member SET card = '00' || card; (postgreSQL 用 || 来连贯字符串) MySQL连贯字符串不能利用加号(+),而利用concat. 比方在aa表的name字段前加字符'x',利用: update aa set name=concat('x',name) 原文地址:https://www.cnblogs.com/zhuyeshen/p/12080381.htm

mysql 用sql 语句去掉某个字段重复值数据的方法

示例代码如下: create table tmp as select min(主键) as col1 from 去重表名 GROUP BY 去重字段; delete from 去重表名 where 主键 not in (select col1 from tmp); drop table tmp;

mysql 动态sql 生成测试数据

#create testtable CREATE TABLE `testtable` (   `id` int(11) NOT NULL,   `createdTime` datetime DEFAULT NULL,   `login` text,   `testid` varchar(63) DEFAULT NULL,   PRIMARY KEY (`id`) ) PARTITION BY RANGE (TO_DAYS(createdTime)) (   PARTITION p01 VALUE

mysql 动态sql的拼接以及执行、分页

1:简历存储过程,标记参数: CREATE DEFINER=`root`@`localhost` PROCEDURE `pos_get_drugInList`(IN page integer,IN limitz integer,IN drugCodez VARCHAR(50),IN effectDatez VARCHAR(50),IN chainIdz VARCHAR(19)) BEGIN DECLARE start integer; set start = (page-1)*limitz; s

mysql下sql语句 update 字段=字段+字符串

原文:mysql下sql语句 update 字段=字段+字符串 mysql下sql语句令某字段值等于原值加上一个字符串 update 表明 SET 字段= 'feifei' || 字段; (postgreSQL 用 || 来连贯字符串) MySQL连贯字符串不能利用加号(+),而利用concat. 比方在aa表的name字段前加字符'x',利用: update aa set name=concat('x',name) 原文地址:https://www.cnblogs.com/lonelyxmas

动态 SQL 及安全性

静态 SQL 与动态 SQL 对于题目中提到的动态 SQL,显然应该有一种静态 SQL 与之相对,那么两者应该怎么理解?我们先来个基本的认识. 静态 SQL 之“静态”,意味着在执行之前就已经明确了该 sql 在数据库执行后的业务含义,也就是对于做啥事儿我们是清楚的,只不过需要知道这事儿的具体内容有哪些.比如“select userID,username from users where deptName=’销售部’”,意思就是查销售部的所有用户 ID 及用户名. 再稍微灵活一点,可以写作“se