group_concat() 函数 拼接字符串长度有限制
2024-09-02 00:54:13
最近,在做一个行转列的存储过程,遇到一个问题,问题如下:
我用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
执行结果如下:
执行结果中,有四条记录超过了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() 函数,合并字符串不能超过1kb ,否则,系统会自动截取超长的字符串,在进行别的操作就会报错了。
最新文章
- 50道java算法题(一)
- Silverlight动态设置WCF服务Endpoint
- 软件工程课后作业——用JAVA编写的随机产生30道四则运算
- 用keyword实现Editor.GetSelection的退出功能
- 【Tcpcopy】离线回放功能
- 设置session存储在int sqlserver上---使用aspnet_regsql.exe工具
- 剑指offer编程题Java实现——面试题12打印1到最大的n位数
- Python round() 函数
- 爱上朴实的CSS细节
- maltab-图像拼接(左右两幅图)
- 关系网络数据可视化:2. Python数据预处理
- c# NPOI 导出EXCEL (在下方显示图片)
- Struts2学习第四天——全局结果,动态结果及异常映射
- Json1:使用gson解析、生成json
- PYTHON-range和xrange区别
- LTR之RankSvm
- 软件包管理:rpm命令管理-安装升级与卸载
- Asterisk——part 1
- C# 引用访问权限,很多老手都不懂
- rsh命令配置于使用