salesforce 零基础学习(三十九) soql函数以及常量

在salesforce中,我们做SOQL查询时,往往需要用到计算式,比如求和,求平均值,或者过滤数据时,往往需要通过时间日期过滤,SOQL已经封装了很多的函数,可以更加方便我们的sql查询而不需要自己另外设计。

一. 聚合函数

常用的聚合函数有如下几种:

AVG():求平均值

COUNT():求记录个数

COUNT_DISTINCT():求不重复记录个数

MIN():求记录中最小值

MAX():求记录中的最大值

SUM():求和

这些聚合函数通常和group by fieldName 一起用,达到分组目的。

下面以Goods__c表进行简单介绍,在Goods表里面新增了四条数据,揭下来通过GoodsBrand对Goods进行分组,求GoodsPrice的总和,平均值,最大值,最小值以及此种GoodsBrand所拥有的条数。

代码如下所示:

1 String fetchGoodsAggregate = 'select GoodsBrand__c,SUM(GoodsPrice__c) goodsPriceTotal,AVG(GoodsPrice__c) goodsPriceAvg,COUNT(Id) recordCount,MIN(GoodsPrice__c) goodsPriceMin,MAX(GoodsPrice__c) goodsPriceMax from Goods__c group by GoodsBrand__c';
2 List<AggregateResult> aggregateResults = Database.query(fetchGoodsAggregate);
3 for(AggregateResult result : aggregateResults) {
4     system.debug(JSON.serializePretty(result));
5 }

结果如下所示:

 1 {
 2   "attributes" : {
 3     "type" : "AggregateResult"
 4   },
 5   "GoodsBrand__c" : "华为",
 6   "goodsPriceTotal" : 5000.0,
 7   "goodsPriceAvg" : 2500.0,
 8   "recordCount" : 2,
 9   "goodsPriceMin" : 2000.000000,
10   "goodsPriceMax" : 3000.000000
11 }
12 
13 {
14   "attributes" : {
15     "type" : "AggregateResult"
16   },
17   "GoodsBrand__c" : "小米",
18   "goodsPriceTotal" : 3000.0,
19   "goodsPriceAvg" : 1500.0,
20   "recordCount" : 2,
21   "goodsPriceMin" : 1000.000000,
22   "goodsPriceMax" : 2000.000000
23 }

上述代码中,我们看到了一个sObject,他的名称为AggregateResult,此sObject的作用为获取计算式查询的结果信息,此sObject为read only类型。在上述查询中,如果需要查到具体的内容,只需在result.get('相关的别名名称')即可获取到值,eg:result.get('goodsPriceTotal')即可获得当前记录的商品总价格。

另外需要注意的是:获取记录条数的函数有两种,一种为count(),一种为count(field name)。当使用Database.countQuery(sql statement)情况下sql语句中使用count(),其他情况下建议使用count(field name),此种写法类似于sql语句中的count(*)。并且如果sql语句中含有group by,则不能使用count()函数。

二. 日期相关处理函数

 在数据查询中,我们很多时候需要通过日期进行数据过滤。这时,使用soql的函数或者常量操作会更加便捷。主要函数和常量如下:

 CALENDAR_YEAR(field name):返回字段对应的年,此字段参数类型可以为Datetime类型也可以为Date类型,返回类型为Number类型。

eg:select Id from Account where CALENDAR_YEAR(CreatedDate) = 2016   -->查询创建时间为2016年的Account

CALENDAR_QUARTER(field name):返回字段对应的季度,其中1代表1月1日-3月31日,2代表4月1日到6月30日,3代表7月1日到9月30日 ,4代表10月1日到12月31日。

此字段类型返回的结果为1-4之间的数字,适用于Datetime或者Date类型。

select Id from Account where CALENDAR_YEAR(CreatedDate) = 2016 and  CALENDAR_QUARTER(CreatedDate) = 2    -->查询创建时间为2016年第二季度的Account

CALENDAR_MONTH(field name):返回参数对应的月,取值范围1--12

DAY_IN_MONTH(field name):返回参数日期中月份对应的日,比如参数如果是2016-02-25   则值返回25.

select count(Id) accountCount from Account where DAY_IN_MONTH(CreatedDate) < 20 group by CALENDAR_YEAR(CreatedDate) -->查询创建的天小于每个月20日的Account,通过年进行分组

DAY_IN_WEEK(field name):返回参数日期中周对应的日,1代表周日,2代表周一,以此类推,7代表周六。

DAY_IN_YEAR(field name):返回参数日期中当前日期在一年(365天)中对应的天数,例如如果是2月1日,则返回32

DAY_ONLY(field name):返回Datetime类型参数对应的Date类型日期。此方法可以实现Datetime类型到Date类型的转换,如果在数据表中,一个Datetime类型需要和一个Date类型作比较,便可以使用DAY_ONLY函数将Datetime类型转换成Date类型。

除了正常的Calendar年月日以外,还有相关的财政年月日,可以自行查看。

HOUR_IN_DAY(field name):返回datetime类型参数中小时数,此参数只能是Datetime类型。

 还有很多常用的函数,详细看API

三.日期处理常用常量

数据查询中,有的时候使用常量会减少很多的参数传递,比如想要查CreatedDate为本年的数据,如果不适用SOQL自带的常量,则sql查询时,便需要apex代码中传递过来当前的年,然后通过CALENDAR_YEAR(CreatedDate)获取当年的匹配,但是如果使用常量,便可以直接CreatedDate = THIS_YEAR搞定问题。

常用常量如下所示:

YESTERDAY: 昨天 select Id from Account where CreatedDate = YESTERDAY   -->查询创建日期为昨天的Account记录

TODAY : 今天   

TOMORROW : 明天

NEXT_N_DAYS:n  超过今天第n天     SELECT Id FROM Opportunity WHERE CloseDate > NEXT_N_DAYS:2   -->查询关闭日期超过后天的Opportunity

THIS_WEEK : 本周

THIS_MONTH : 本月

NEXT_N_MONTH:n  超过本月第n月

THIS_QUARTER : 本季度

THIS_YEAR : 本年

总结:此篇只是列举部分函数以及常量,如果需要详细自行参看官方PDF,如果内容有错误地方欢迎批评指正,如果有问题欢迎留言。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏软件开发

MyBatis学习总结(二)——MyBatis核心配置文件与输入输出映射

在上一章中我们学习了《MyBatis学习总结(一)——ORM概要与MyBatis快速起步》,这一章主要是介绍MyBatis核心配置文件、使用接口+XML实现完整...

592
来自专栏大数据学习笔记

Hadoop源码分析:HDFS读取文件

Hadoop源码分析:HDFS读取文件 上一篇博客http://blog.csdn.net/chengyuqiang/article/details/78636...

3386
来自专栏窗户

我博客上的围棋js程序

  版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址   http://www.cnblogs.com/Colin-C...

3336
来自专栏闻道于事

JFinal极速开发框架使用笔记(二) 两个问题,一个发现

最近给新人出了一个小测试,我也用JFinal框架做了一下,记录一下使用过程中遇到的坑和新学到的知识点 首先是遇到的两个小问题, 一个是用最新版的eclipse运...

3535
来自专栏好好学java的技术栈

Java11震撼发布了,我们该怎么办?

Java11已经发布了,我们今天聊聊大家还停留在哪个版本呢?大家对于新版本的迅速的发布有什么想说的呢?

702
来自专栏MasiMaro 的技术博文

枚举进程中的模块

在Windows中枚举进程中的模块主要是其中加载的dll,在VC上主要有2种方式,一种是解析PE文件中导入表,从导入表中获取它将要静态加载的dll,一种是利用查...

982
来自专栏开发技术

spring-boot-2.0.3不一样系列之源码篇 - springboot源码一,绝对有值得你看的地方

  上篇:spring-boot-2.0.3不一样系列之shiro - 搭建篇,实现了spring-boot与shiro的整合,效果大家也看到了,工程确实集成了...

832
来自专栏Danny的专栏

【SSH快速进阶】——Hibernate继承映射:每个类映射一张表

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

643
来自专栏difcareer的技术笔记

Android Linker学习笔记[转]

Linker是Android系统动态库so的加载器/链接器,要想轻松地理解Android linker的运行机制,我们需要先熟悉ELF的文件结构,再了解ELF文...

1184
来自专栏我是攻城师

Solr中如何使用游标进行深度分页查询

2976

扫码关注云+社区