详细解释PostgreSQL在GROUP BY子句中使用常量的特殊
  • 作者:admin
  • 发表时间:2021-04-26 07:51
  • 来源:未知

一、问题描述

最近一个统计程序从Oracle移植到PostgreSQL(9.4版)时,报告的错误一个接一个:

错误消息1:按位置0划分的PostgreSQL组不在选择列表中。

错误消息2:分组依据中的非整数常量。

生成错误的sql类似于:

插入sum_tab (IntField1,IntField2,StrField1,StrField2,cnt)

从detail_tab中选择IntField,0,StrField,' null ',count(*)选项

在哪里.

按IntField分组,0,StrField,“null”;

其中detail_tab表保存原始明细记录,sum_tab保存统计后记录的信息。

二、原因分析

经过测试,发现错误是因为PostgreSQL对GROUP BY子句中常量的使用有特殊限制。测试过程太繁琐,这里就不一一写演示了,直接给出结论:

1string和浮点常量不能在group by子句中使用,否则将报告错误消息2。例如:

选择国际字段,“aaa”,按国际字段从选项卡组中计数(*),“AAA”;选择国际字段,0.5,按国际字段从选项卡组中计数(*),0.5;

0和负整数不能用于2 GROUP BY子句,否则将报告错误消息1。例如:

通过输入字段0从选项卡组中选择输入字段0、计数(*);选择输入字段,-1,按输入字段从选项卡组中计数(*),-1;

那么,GROUP BY子句中可以使用什么样的常量呢?经过测试,正整数和日期常量可以在常用类型中使用。

按输入字段1从选项卡组中选择输入字段1,计数(*);从选项卡组中选择IntField,now(),count(*)按IntField,now();

对于第一节的sql,因为0和‘null’有特殊含义,怎么办?

实际上,在GROUP BY子句中,您可以只列出聚合字段,而不使用任何常量,也就是说,将第一部分中的sql更改为:

插入sum_tab (IntField1,IntField2,StrField1,StrField2,cnt)

从detail_tab中选择IntField,0,StrField,' null ',count(*)选项

在哪里.

按IntField、StrField分组;

三、M唐山软件开发ySQL

考虑到统计程序未来可能会移植到MySQL(8 . x版)上,进行了类似的测试,结论如下:

1支持不带任何常数的GROUP BY子句;

支持包含非零整数、浮点数(包括0.0)、字符串和日期常量的GROUP BY子句。

也就是说,在常见类型中,MySQL 8的GROUP BY子句支持除整数0(不是浮点数0.0)以外的所有类型。否则,将报告一个错误:

错误1054 (42S22):“组语句”中的未知列“0”

顺带一提,Oracle也支持整数0。

四.结论

1.PostgreSQL的GROUP BY子句只支持正整数和日期类型的常量;

2.MySQL支持除整数0以外的所有常规类型常量,而Oracle似乎都支持。

3.如果在各种数据库平台中需要可移植性,尽量不要在GROUP BY子句中使用常量。