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;

三、MySQL的情况

考虑到将来统计程序也可能移植到MySQL(版本8.x),随后进行了类似测试,结论为:

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

2 支持带非0整数、浮点数(包括0.0)、字符串、日期型常量的GROUP BY子句。

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

ERROR 1054 (42S22): Unknown column ‘0’ in ‘group statement’

顺便说一句,Oracle对整数0也支持。

四、结论

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

2、MySQL支持除非0整数以外的所有常规类型常量,而Oracle似乎全部支持;

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

补充:PostgreSQL的GROUP BY问题

关于PostgreSQL数据库分组查询时,跟mysql还是有区别的。纠结了半天

SELECT
 prjnumber,
 zjhm,
— to_char ( to_timestamp ( kqsj / 1000 ), ‘yyyy-MM-dd HH24:MI:SS’ ) kqsj,

 kqflag,
 workername,
 max(kqsj)
 
— workertype,
— tpcodename,
— isactive
FROM
 GB_CLOCKINGIN
WHERE
 kqsj BETWEEN 1590940800000 AND 1593532799000
 AND prjnumber = ‘3205842019121101A01000’

GROUP BY
 zjhm,
 kqflag,
 prjnumber,
 workername
文章来源:脚本之家

来源地址:https://www.jb51.net/article/205406.htm

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:SEO优化专员,转转请注明出处:https://www.chuangxiangniao.com/p/894177.html

(0)
上一篇 2025年1月4日 00:01:24
下一篇 2025年1月4日 00:01:48

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • SQLite 中文指南之FAQ第1/6页

    sqllite使用过程中碰到的一些问题解决,中文版 1. 如何创建自增字段? 2. SQLite 支持哪些数据类型? 3. 为什么能向 SQLite 数据库的整型字段中插入字符串? 4. 为什么 SQLite 认为表达式 ‘0&…

    数据库 2025年1月4日
    100
  • Access创建一个简单MIS管理系统

    所谓MIS管理系统,是一个由人、计算机及其他外围设备等组成的能进行信息的收集、传递、存贮、加工、维护和使用的系统。MIS管理系统是一种新兴的技术,那么下文中就给大家介绍Access这个有历史的数据库系统如何创建一个简单的MIS管理系统。 M…

    数据库 2025年1月4日
    100
  • 读取注册表根据Office版本获取数据库连接字段

    本节主要介绍了如何根据Office版本获取数据库连接字段,以读取注册表获取Office版本,实现代码如下,感兴趣的朋友不要错过 /// /// 读取注册表,根据Office版本获取数据库连接字段 /// /// 数据库连接字段 privat…

    数据库 2025年1月4日
    100
  • PostgreSQL操作符实践技巧分享

    这篇文章主要给大家介绍了关于PostgreSQL基础知识之SQL操作符实践的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PostgreSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 前言 操作符是数据库具有的…

    2025年1月4日
    100
  • SQL Server如何通过创建临时表遍历更新数据详解

    这篇文章主要给大家介绍了关于SQL Server如何通过创建临时表遍历更新数据的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 前言: 前段时间新项目上线为了赶…

    2025年1月4日
    100
  • Mac系统重置PostgreSQL密码技巧及代码展示

    PostgreSQL 是一个免费的对象-关系数据库服务器(ORDBMS),在灵活的BSD许可证下发行。这篇文章主要介绍了Mac系统重置PostgreSQL密码的方法示例代码,需要的朋友可以参考下 PostgreSQL是一种特性非常齐全的自由…

    数据库 2025年1月4日
    100
  • PostgreSQL技巧分享:图(graph)的递归查询实例

    这篇文章主要给大家介绍了关于PostgreSQL图(graph)的递归查询的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用PostgreSQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 背景 在树形递归查询这篇文…

    2025年1月4日
    100
  • PostgreSQL技巧 如何获取当前日期时间

    这篇文章主要介绍了PostgreSQL 如何获取当前日期时间及注意事项,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 在开发数据库应用或者调试代码时,经常需要获取系统的…

    数据库 2025年1月4日
    100
  • postgresql中的ltree类型使用技巧

    这篇文章主要给大家介绍了关于postgresql中ltree类型使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用postgresql具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧 postgresql有很多比较妖…

    2025年1月4日
    100
  • MongoDB通配符索引的用法实例

    这篇文章主要给大家介绍了关于MongoDB通配符索引的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 指南 MongoDB在4.2 版本推出了Wildcard …

    数据库 2025年1月4日
    100

发表回复

登录后才能评论

联系我们

156-6553-5169

在线咨询: QQ交谈

邮件:253000106@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

联系微信