婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PostgreSQL對GROUP BY子句使用常量的特殊限制詳解

PostgreSQL對GROUP BY子句使用常量的特殊限制詳解

熱門標簽:高德地圖標注電話怎么沒了 智能電銷機器人教育 北京智能外呼系統供應商家 江西穩定外呼系統供應商 中國地圖標注省份用什么符號 電話機器人錄音師薪資 奧維地圖標注字體大小修改 孝感銷售電銷機器人廠家 無錫梁溪公司怎樣申請400電話

一、問題描述

最近,一個統計程序從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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • PostgreSQL中的VACUUM命令用法說明
  • PostgreSQL 如何查找需要收集的vacuum 表信息
  • PostgreSQL備份工具 pgBackRest使用詳解
  • postgresql數據合并,多條數據合并成1條的操作
  • postgresql數據添加兩個字段聯合唯一的操作
  • postgreSQL使用pgAdmin備份服務器數據的方法
  • Postgresql 查看SQL語句執行效率的操作

標簽:通化 臨滄 那曲 荊州 泰州 海北 阜陽 齊齊哈爾

巨人網絡通訊聲明:本文標題《PostgreSQL對GROUP BY子句使用常量的特殊限制詳解》,本文關鍵詞  PostgreSQL,對,GROUP,子句,使用,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PostgreSQL對GROUP BY子句使用常量的特殊限制詳解》相關的同類信息!
  • 本頁收集關于PostgreSQL對GROUP BY子句使用常量的特殊限制詳解的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 西华县| 含山县| 汝阳县| 恭城| 江门市| 淅川县| 察隅县| 酉阳| 临潭县| 瓮安县| 荆门市| 鹿邑县| 民县| 郁南县| 苗栗县| 连州市| 苏州市| 朝阳市| 宕昌县| 陵水| 辽中县| 锡林浩特市| 定远县| 乐业县| 广丰县| 鸡泽县| 桐梓县| 玉门市| 华安县| 黎城县| 韶山市| 大名县| 商城县| 湛江市| 富顺县| 博客| 广宗县| 拜泉县| 揭阳市| 沐川县| 乐业县|