group_concat() 函数 拼接字符串长度有限制

时间:2022-04-07 20:33:46

最近,在做一个行转列的存储过程,遇到一个问题,问题如下:

   我用group_concat()函数 来整合一个月每天的操作量,并将每天的操作量用CONCAT()函数拼接成 “MAX(IF(t.a = '2017-11-01', t.s, 0))”格式,最后用group_concat()函数来拼接。

   代码如下:

SELECT @sql:= GROUP_CONCAT(
    CONCAT(
        'MAX(IF(t1.op_date=\'', t1.op_date, '\'',',t1.op_sum,0)) AS\'opt', day(dt), '\''
    )) ,
@str:= GROUP_CONCAT(CONCAT('MAX(IF(t1.op_date=\'', t1.op_date,'\'',',t1.day_sal,0)) AS\'sal', day(dt), '\'')),
t1.staf_no,
t1.fb_code
FROM tableName AS t1
WHERE
   t1.fb_code = 100088
   AND t1.op_date BETWEEN "2017-08-01" AND LAST_DAY("2017-08-01")
GROUP BY
   t1.fb_code,t1.staf_no

执行结果如下:

group_concat() 函数 拼接字符串长度有限制

执行结果中,有四条记录超过了1kb,实际上这四条记录已经超过1kb了,只是系统自动截取了字符串而已。

具体的字符串显示:

MAX(IF(t1.op_date='2017-08-29',t1.op_sum,0)) AS'opt29',
MAX(IF(t1.op_date='2017-08-06',t1.op_sum,0)) AS'opt6',
MAX(IF(t1.op_date='2017-08-24',t1.op_sum,0)) AS'opt24',
MAX(IF(t1.op_date='2017-08-01',t1.op_sum,0)) AS'opt1',
MAX(IF(t1.op_date='2017-08-19',t1.op_sum,0)) AS'opt19',
MAX(IF(t1.op_date='2017-08-14',t1.op_sum,0)) AS'opt14',
MAX(IF(t1.op_date='2017-08-09',t1.op_sum,0)) AS'opt9',
MAX(IF(t1.op_date='2017-08-27',t1.op_sum,0)) AS'opt27',
MAX(IF(t1.op_date='2017-08-04',t1.op_sum,0)) AS'opt4',
MAX(IF(t1.op_date='2017-08-22',t1.op_sum,0)) AS'opt22',
MAX(IF(t1.op_date='2017-08-17',t1.op_sum,0)) AS'opt17',
MAX(IF(t1.op_date='2017-08-12',t1.op_sum,0)) AS'opt12',
MAX(IF(t1.op_date='2017-08-30',t1.op_sum,0)) AS'opt30',
MAX(IF(t1.op_date='2017-08-07',t1.op_sum,0)) AS'opt7',
MAX(IF(t1.op_date='2017-08-25',t1.op_sum,0)) AS'opt25',
MAX(IF(t1.op_date='2017-08-02',t1.op_sum,0)) AS'opt2',
MAX(IF(t1.op_date='2017-08-20',t1.op_sum,0)) AS'opt20',
MAX(IF(t1.op_date='2017-08-15',t1.op_sum,0)) AS'opt15',
MAX(IF(t1.op_date='2017-08-10',t1.op_sum

可以看到最后的结果中,超过ikb ,MYSQL数据库会自动进行截取。为此本人查阅了很多资料,但是无果。通过自己的尝试,总算解决了问题。

解决方法: 将将每天的操作量用CONCAT()函数合并到最简,如下:

GROUP_CONCAT(
    CONCAT(
        'MAX(IF(m.a=\'', day(t.op_date), '\'',',m.p,0)) \'n', day(dt), '\''
    )
)

结果如下:

MAX(IF(m.a='27',m.p,0)) 'n27',MAX(IF(m.a='16',m.p,0)) 'n16',
MAX(IF(m.a='5',m.p,0)) 'n5',MAX(IF(m.a='26',m.p,0)) 'n26',
MAX(IF(m.a='15',m.p,0)) 'n15',MAX(IF(m.a='4',m.p,0)) 'n4',
MAX(IF(m.a='25',m.p,0)) 'n25',MAX(IF(m.a='14',m.p,0)) 'n14',
MAX(IF(m.a='3',m.p,0)) 'n3',MAX(IF(m.a='24',m.p,0)) 'n24',
MAX(IF(m.a='13',m.p,0)) 'n13',MAX(IF(m.a='2',m.p,0)) 'n2',
MAX(IF(m.a='23',m.p,0)) 'n23',MAX(IF(m.a='12',m.p,0)) 'n12',
MAX(IF(m.a='1',m.p,0)) 'n1',MAX(IF(m.a='22',m.p,0)) 'n22',
MAX(IF(m.a='11',m.p,0)) 'n11',MAX(IF(m.a='21',m.p,0)) 'n21',
MAX(IF(m.a='10',m.p,0)) 'n10',MAX(IF(m.a='31',m.p,0)) 'n31',
MAX(IF(m.a='20',m.p,0)) 'n20',MAX(IF(m.a='9',m.p,0)) 'n9',
MAX(IF(m.a='30',m.p,0)) 'n30',MAX(IF(m.a='19',m.p,0)) 'n19',
MAX(IF(m.a='8',m.p,0)) 'n8',MAX(IF(m.a='29',m.p,0)) 'n29',
MAX(IF(m.a='18',m.p,0)) 'n18',MAX(IF(m.a='7',m.p,0)) 'n7',
MAX(IF(m.a='28',m.p,0)) 'n28',MAX(IF(m.a='17',m.p,0)) 'n17',MAX(IF(m.a='6',m.p,0)) 'n6'

group_concat() 函数 拼接字符串长度有限制

结果显而易见,压缩后,整个月的信息都被显示出来了

总结:最后,强调一下group_concat() 函数,合并字符串不能超过1kb ,否则,系统会自动截取超长的字符串,在进行别的操作就会报错了。