求优化一个存储过程.起始就是怎么遍历一行中的所有列并进行判断其值

快40的码农 2016-05-12 11:06:58
PROCEDURE monitor_calculate(IN in_fatherid bigint, IN occurTimestamp bigint, OUT flag int)
monitor_calculate:
BEGIN
DECLARE ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8,ch9,ch10,ch11,ch12 varchar(20);
DECLARE strsql varchar(4000);
DECLARE tmp varchar(100);
DECLARE scount int DEFAULT 0;
DECLARE _select varchar(500) DEFAULT 'SELECT ';
DECLARE _where varchar(500) DEFAULT CONCAT(' WHERE', occurTimestamp);

SET flag = 0;
SELECT childrenID1,childrenID2,childrenID3,childrenID4,childrenID5,childrenID6,childrenID7, childrenID8,childrenID9,childrenID10,childrenID11,childrenID12 INTO ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10, ch11, ch12
FROM `monitor_calculate_info` WHERE fatherid = in_fatherid; -- '518000590017' ;
SET strsql = 'SELECT SUM(activeDemand),SUM(reactiveDemand),SUM(totalActivePower),SUM(totalReactivePower),SUM(totalActiveKwh), SUM(jianKwh),SUM(fengKwh),SUM(pingKwh),SUM(guKwh),SUM(inductanceKwh),SUM(capacitanceKwh) from (';
IF ch1 != 'NULL' THEN
SET @tmp=CONCAT('SELECT COUNT(*) into @nub FROM monitordata', ch1, _where);
PREPARE sqltext FROM @tmp;
EXECUTE sqltext;
DEALLOCATE PREPARE sqltext;
SELECT @nub INTO scount ;
IF scount = 0 THEN
LEAVE monitor_calculate;
ELSE
SET strsql = CONCAT(strsql,_select, ch1, _where);
END IF;
END IF;

IF ch2 != 'NULL' THEN
SET @tmp=CONCAT('SELECT COUNT(*) into @nub FROM monitordata', ch2, _where);
PREPARE sqltext FROM @tmp;
EXECUTE sqltext;
DEALLOCATE PREPARE sqltext;
SELECT @nub INTO scount ;
IF scount = 0 THEN
LEAVE monitor_calculate;
ELSE
SET strsql = CONCAT(strsql, ' union ',_select, ch2, _where);
END IF;
END IF;

IF ch3 != 'NULL' THEN
SET @tmp=CONCAT('SELECT COUNT(*) into @nub FROM monitordata', ch3, _where);
PREPARE sqltext FROM @tmp;
EXECUTE sqltext;
DEALLOCATE PREPARE sqltext;
SELECT @nub INTO scount ;
IF scount = 0 THEN
LEAVE monitor_calculate;
ELSE
SET strsql = CONCAT(strsql, ' union ',_select, ch3, _where);
END IF;
END IF;

IF ch4 != 'NULL' THEN
SET @tmp=CONCAT('SELECT COUNT(*) into @nub FROM monitordata', ch4, _where);
PREPARE sqltext FROM @tmp;
EXECUTE sqltext;
DEALLOCATE PREPARE sqltext;
SELECT @nub INTO scount ;
IF scount = 0 THEN
LEAVE monitor_calculate;
ELSE
SET strsql = CONCAT(strsql, ' union ',_select, ch4, _where);
END IF;
END IF;

IF ch5 != 'NULL' THEN
SET @tmp=CONCAT('SELECT COUNT(*) into @nub FROM monitordata', ch5, _where);
PREPARE sqltext FROM @tmp;
EXECUTE sqltext;
DEALLOCATE PREPARE sqltext;
SELECT @nub INTO scount ;
IF scount = 0 THEN
LEAVE monitor_calculate;
ELSE
SET strsql = CONCAT(strsql, ' union ',_select, ch5, _where);
END IF;
END IF;

/* 此处省略了从ch56至ch12的判断*/

SET strsql = CONCAT(strsql, ' ) a');
SET @tmp=strsql;
PREPARE sqltext FROM @tmp;
EXECUTE sqltext;-- 查询结果集

SET flag=1;-- 设置结果标志
END
...全文
130 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
快40的码农 2016-05-12
  • 打赏
  • 举报
回复
引用 1 楼 gikod 的回复:
需要优化什么?
@gikod 我这个有12个列,要一个一个判断,能不能写个循环什么的,减少下代码 还有,我如果有一个列数据为空,那后面的就不判断了,直接输出了.
gikod 2016-05-12
  • 打赏
  • 举报
回复
需要优化什么?
快40的码农 2016-05-12
  • 打赏
  • 举报
回复
引用 4 楼 gikod 的回复:
[quote=引用 3 楼 gikod 的回复:] [quote=引用 2 楼 SuperMan_ 的回复:] [quote=引用 1 楼 gikod 的回复:] 需要优化什么?
@gikod 我这个有12个列,要一个一个判断,能不能写个循环什么的,减少下代码 还有,我如果有一个列数据为空,那后面的就不判断了,直接输出了.[/quote] mysql的cursor不能像oracle的dbms_sql那样用循环处理。 不过动态的sql是可以随便拼的。
外循环,取得每一行的pk
  内循环,用pk和列名,对每一行的每一列单独做select
    sql = concat('select ', col, ' from ... where pk = ', pk);
    ...
    做判断,退出
[/quote] 你的sum可以存到临时表里。[/quote] 我这个数据取出来只有一行数据,归根到底就是做单行数据的列循环,但怎么取单行数据的列不知道怎么做
gikod 2016-05-12
  • 打赏
  • 举报
回复
引用 3 楼 gikod 的回复:
[quote=引用 2 楼 SuperMan_ 的回复:] [quote=引用 1 楼 gikod 的回复:] 需要优化什么?
@gikod 我这个有12个列,要一个一个判断,能不能写个循环什么的,减少下代码 还有,我如果有一个列数据为空,那后面的就不判断了,直接输出了.[/quote] mysql的cursor不能像oracle的dbms_sql那样用循环处理。 不过动态的sql是可以随便拼的。
外循环,取得每一行的pk
  内循环,用pk和列名,对每一行的每一列单独做select
    sql = concat('select ', col, ' from ... where pk = ', pk);
    ...
    做判断,退出
[/quote] 你的sum可以存到临时表里。
gikod 2016-05-12
  • 打赏
  • 举报
回复
引用 2 楼 SuperMan_ 的回复:
[quote=引用 1 楼 gikod 的回复:] 需要优化什么?
@gikod 我这个有12个列,要一个一个判断,能不能写个循环什么的,减少下代码 还有,我如果有一个列数据为空,那后面的就不判断了,直接输出了.[/quote] mysql的cursor不能像oracle的dbms_sql那样用循环处理。 不过动态的sql是可以随便拼的。
外循环,取得每一行的pk
  内循环,用pk和列名,对每一行的每一列单独做select
    sql = concat('select ', col, ' from ... where pk = ', pk);
    ...
    做判断,退出

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧