南大通用GBase 8s_GROUP BY支持标量函数和表达式问题详解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Group By支持标量函数和表达式问题详解

1概述

为与主流数据库兼容,GBase 8s在很多国产化替代项目中做了很多努力,其中,Group By语句对标量函数及表达式的支持问题较为典型,这篇文章会详细阐述一下。

2问题现状

2.1现状描述

在某国产化替代项目现场出现如下场景:Group By子句需要支持to_char函数分组(包含不在投影列中的字段)。在这种场景下,GBase 8s会报错“SQL错误【ErrorCode:-201】【SQLState:42000】:A syntax error has occurred.”。如下所示:

源SQL:

select

count(distinct(t.col4)) as psr_num,

1 as defaulVal,

t.col2

from test t

where t.col1 > 10

group by t.col2,to_char(t.col5,'YYYY-MM-DD') ;

2.2问题分析

在某主流数据库中对Group By语句对标量函数及表达式支持情况进行测试分析,过程如下。

a.测试表table1结构:

col1col2col3col4col5col6

12312019-10-10 12:12:122019-10-11 12:12:12 b.测试过程:

⚫标量函数

➢测试SQL:

标量函数:

SQL1: select col2, to_char(col5,'YYYY-MM-DD

HH:MM:SS'),count(distinct(col4)) from table1 group by col2, to_char(col5,'YYYY-MM-DD HH:MM:SS');

SQL2: select abs(col2), count(distinct(col4)) from table1 group by abs(col2), col1;

SQL3: select to_char(col5,'YYYY') from table1 group by to_char(col5,'YYYY-MM');

SQL4: select to_char(col2) from table1 group by abs(col2);

SQL5: select col3+abs(col2), count(distinct(col4)) from table1 group by abs(col2), col3;

嵌套函数:

SQL6: select sum(avg(abs(col2))) from table1 group by nvl(col2,col3);

SQL7: select avg(sum(avg(abs(col2)))) from table1 group by nvl(col2,col3);

SQL8: select to_char(abs(abs(col2))) from table1 group by

to_char(abs(abs(col2)));

➢测试结果:

SQL1-2、SQL5语句执行成功,SQL3-4语句执行失败,说明标量函数在select 投影列中单独存在时需与group by语句中出现的标量函数保持一致,包括函数名称及参数。

SQL6、SQL8语句执行成功,SQL7语句执行失败,说明select投影列中聚合函数最多嵌套两层,而标量函数可无限嵌套,但投影列与group by语句中嵌套的标量函数必须保持一致。

⚫表达式

➢测试SQL:

算术表达式

SQL1: select col1+col2, count(distinct(col4)) from table1 group by col2+col1, col3;

SQL2: select 1+col2, count(distinct(col4)) from table1 group by col2+1, col3;

SQL3: select col2+1+col3, count(distinct(col4)) from table1 group by col2+1, col3;

SQL4: select col2+col3+1, count(distinct(col4)) from table1 group by col2+1, col3;

比较表达式:

SQL5: select count(col2) from table1 group by col2>1;

逻辑表达式:

SQL6: select count(col2) from table1 group by col2>1 and col2<10;

按位表达式:

SQL7: select count(col2) from table1 group by col2 | col3;

➢测试结果:

SQL1-3:主流数据库均支持。

SQL4-7:均不支持。

说明group by语句后的表达式仅支持算术表达式且遵循交换律,对比较表达式、逻辑表达式和按位表达式并不提供支持。

⚫标量函数+表达式

➢测试SQL:

SQL1: select 1+abs(col2), count(distinct(col4)) from table1 group by abs(col2)+1, col3;

SQL2: select 1+abs(col2)+col3, count(distinct(col4)) from table1 group by abs(col2)+1, col3;

相关文档
最新文档