MYSQL:我如何使用串联字符串作为列名迭代表列?

时间:2016-09-05 07:21:50

标签: mysql loops string-concatenation

我正在寻找一种方法来循环遍历MYSQL表中的列,使用连接字符串来索引循环中的列名。表中数据的示例可能如下所示:

R1       R2     R3       R4     
0.68    0.08    0.04    4.24
0.15    1.17    3.06    0.57
1.59    0.48    1.39    1.00
1.59    0.77    1.13    0.22
0.90    0.23    0.73    0.52

列名只是字符" R"和一个数字(最终列数会有所不同,所以数字可能会达到100)。我想迭代列来计算每列中超过阈值的值的数量(我使用三个阈值:3.0,5.0和10.0)。调用该过程的结果应如下所示:

str2    total   ThreeCount  FiveCount   TenCount
`R1`    8772    794            153        1

str2    total   ThreeCount  FiveCount   TenCount
`R2`    8772    382             42        0

我一直使用以下代码作为存储过程来测试进程(我使用5进行测试,因此迭代前五列数据值):

BEGIN
 DECLARE x  INT;
 DECLARE str1  VARCHAR(1);
 DECLARE str2  VARCHAR(5);
 DECLARE str3  VARCHAR(1);

 SET x = 1;
 SET str1 =  "R";
 SET str2 = "";
 SET str3 = "`";

 WHILE x  <= 5 DO
 SET  str2 = CONCAT(str3,str1,x,str3);
select str2,
    count(*) total,
    sum(case when str2 > 3.0 then 1 else 0 end) ThreeCount,
    sum(case when str2 > 5.0 then 1 else 0 end) FiveCount,
    sum(case when str2 > 10.0 then 1 else 0 end) TenCount
from test_dat;
SET  x = x + 1;
 END WHILE;

 END

然而,除非我替换&#34; str2&#34;否则程序返回零值(总数除外)。使用实际列名称(例如将str2替换为R1R2等)。但是我宁愿不使用实际的列名。

如何将连接字符串(str2)识别为列名?我尝试了各种串联组合,例如:

SET  str2 = CONCAT(str1,x);

但是没有任何一个非零计数。

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:3)

标准化设计可能看起来像这样

id r val 
 1 1 0.68    
 2 1 0.15    
 3 1 1.59    
 4 1 1.59    
 5 1 0.90    

 6 2 0.08    
 7 2 1.17    
 8 2 0.48    
 9 2 0.77    
10 2 0.23 

11 3 0.04    
12 3 3.06    
13 3 1.39    
14 3 1.13    
15 3 0.73    

16 4 4.24
17 4 0.57
18 4 1.00
19 4 0.22
20 4 0.52