PostgreSQL GROUP BY 자구 사용 상수에 대한 특수 제한 상세 정보

1. 문제 설명


최근 Oracle에서 PostgreSQL(버전 9.4)로 통계를 마이그레이션하는 동안 오류가 잇따라 보고되었습니다.
오류 정보1:postgresql group by position 0은 선택 목록에 없습니다.
오류 정보 2: 그룹 BY의 non-integer constant.
오류가 발생한 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는 통계 후의 기록 정보를 저장합니다.

2. 원인 분석


테스트를 통해 오류가 발견된 것은 PostgreSQL이 GROUP BY 자구에 대해 사용 상수에 특별한 제한을 두었기 때문이다.테스트 과정이 너무 번거롭다. 여기는 더 이상 일일이 데모를 쓰지 않고 결론을 내린다.
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();
1절의 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;

3. 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의 그룹 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
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.

좋은 웹페이지 즐겨찾기