PostgreSQL对GROUP BY子句使用常量的特殊限制说明

一、问题描述
 
最近,一个统计程序从Oracle移植到PostgreSQL(版本9.4)时,接连报告错误:
 
错误信息1: postgresql group by position 0 is not in select list.
 
错误信息2: non-integer constant in GROUP BY.
 
产生错误的sql类似于:
 
insert into sum_tab (IntField1, IntField2, StrField1, StrField2, cnt)
select IntField, 0, StrField, 'null', count(*) from detail_tab
where …
group by IntField, 0, StrField, 'null';
 
 
 
其中,detail_tab表保存原始的详细记录,而sum_tab保存统计后的记录信息。
 
二、原因分析
 
经过测试,发现错误是因为PostgreSQL对GROUP BY子句使对使用常量有着特殊限制。测试过程过于繁琐,这里不再一一写demo了,直接给出结论:
 
1 GROUP BY子句中不能使用字符串型、浮点数型常量, 否则会报告错误信息2。如:
 
select IntField, 'aaa', count(*) from tab group by IntField, 'aaa'; select IntField, 0.5, count(*) from tab group by IntField, 0.5;
 
2 GROUP BY子句中也不能使用0和负整数,否则会报错误信息1。如:
 
select IntField, 0, count(*) from tab group by IntField, 0;select IntField, -1, count(*) from tab group by IntField, -1;
 
那么,GROUP BY子句中可以使用什么类型的常量?经测试,在常用的类型中,正整数、日期型常量均可以。
 
select IntField, 1, count(*) from tab group by IntField, 1;select IntField, now(), count(*) from tab group by IntField, now();
 
对于第一节中的sql,因为0和‘null'有着特殊的含义,该如何处理?
 
实际上,在GROUP BY子句中可以不使用任何常量,只列出聚集字段即可,即将第一节中的sql改为:
 
insert into sum_tab (IntField1, IntField2, StrField1, StrField2, cnt)
select IntField, 0, StrField, 'null', count(*) from detail_tab
where …
group by IntField, StrField;
【声明】:芜湖站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

相关文章